Stack 만들기 version 3.3
C++ LinkedList로 Stack 만들기 version 3.2에 Information hiding 요소를 보완하여 만들어 보겠다.
https://suldenlion.tistory.com/83
Information hiding을 잘 할줄 아는가 못하는가에 따라 코드 작성한 사람이 객체지향 기법을 잘 다룰줄 아는지 모르는지를 바로 알 수 있을 정도로 중요하다고 한다.
LinkedList로 Stack을 만들어 오고 있는데, 이전 버전까지는 Stack 객체 따로, Node 객체 따로 정의해서 사용하였다.
프로그래머 입장에서는 Stack과 Node를 모두 사용하면서 코딩을 하기 때문에 문제없지만, 어떠한 사용자가 이 프로그램을 사용한다고 할 때, 사용자 입장에서는 Stack을 갖다 쓰는 것과 push, pop하는 함수만 갖다 쓰면 되지 사용에 있어서 굳이 Node의 존재를 알 필요가 없다. 즉, 노출이 불필요한 Data member와 Member function들은 해당 정보들을 은닉할 필요가 있다.
코드를 보면서 더 정리해 보겠다.
#include <stdio.h>
#include "Stack.h"
void main()
{
Stack a;
a.push(10);
a.push(20);
a.push(30);
int x = a.pop();
a.push(40);
printf("%d\n", x);
printf("%d\n", a.pop());
/*Stack *a;
a = new Stack();
Stack *b = a;
a->push(10);
a->push(20);
a->push(30);
int x = a->pop();
a->push(40);
for (int i = 100; i < 120; i++) {
a->push(i);
}
printf("%d\n", x);
printf("%d\n", a->pop());
a->print();
delete a;*/
//delete b;
}
push, pop 작업등을 할 메인함수이다
바로 헤더 파일을 보겠다.
#ifndef _STACK_H
#define _STACK_H
#include <stdio.h>
class Stack {
class Node {
int data;
Node *next;
public:
Node(int x) {
data = x;
next = NULL;
}
inline Node *getNext() { return next; }
inline int getData() { return data; };
inline void setNext(Node *p) { next = p; }
};
Node *top;
void stackEmptyError();
public:
Stack();
~Stack();
void push(int x);
int pop();
int peek();
void print();
};
#endif
이전까지 Stack 따로 Node 따로 정의하여 사용하였는데 Node 클래스를 Stack 클래스안에 Inner class 로써 캡슐화 시킬 것이다. 사용자들 입장에서는 Node의 존재를 알 필요 없이 사용할 수 있게 된다.
그리고 Node의 Data member들은 getters와 setters 함수들을 통해 접근하도록 할 것이다. getNext() 함수를 통해 next를 가리키는 포인터 값을 알아오고, getData()를 통해 data 값을 알아와 사용할 것이다. setNext()는 next에 다음 노드를 연결시키는 작업이 될 것이다.
그리고 함수명들 앞에 inline이 붙어있는데 이는 get/set 함수 등 한 줄짜리 라인의 함수를 매크로처럼 처리하겠다는 용도이다. 즉, 빠른 속도 처리를 위해 사용한다.
#include "Stack.h"
#include <stdio.h>
#include <stdlib.h>
Stack::Stack()
{
top = NULL;
}
Stack::~Stack()
{
Node *tmp = top;
while (tmp != NULL) {
Node *p = tmp;
tmp = tmp->getNext();
delete p;
}
}
void Stack::print()
{
printf("[");
Node *tmp = top;
while (tmp != NULL) {
printf("%d", tmp->getData());
if (tmp->getNext() != NULL) {
printf(",");
}
tmp = tmp->getNext();
}
printf("]\n");
}
void Stack::push(int x)
{
Node *tmp = new Node(x);
tmp->setNext(top);
top = tmp;
}
int Stack::pop()
{
if (top == NULL) stackEmptyError();
int x = top->getData();
Node *p = top;
top = top->getNext();
delete p;
return x;
}
int Stack::peek()
{
if (top == NULL) stackEmptyError();
return top->getData();
}
void Stack::stackEmptyError()
{
printf("Stack Empty!!!\n");
exit(-1);
}
그리고 Stack.cpp 파일이다. Node *p가 있다면 p->data, p->next 등 Data member에 바로 참조하던것을 p->getData(), p->getNext()로 고쳐준다.
'Data Structure' 카테고리의 다른 글
C LinkedList 만들기 (version 1) (0) | 2023.03.23 |
---|---|
C++ Stack 만들기 (version.4 - Operator overloading이란?) (0) | 2023.03.20 |
C++ Stack 만들기 (version.3.2 - LinkedList Stack) (0) | 2023.03.18 |
C++ Queue 만들기 (version.4 - LinkedList Queue) (0) | 2023.03.18 |
C++ Stack 만들기 (version.3.1 - LinkedList Stack) (0) | 2023.03.17 |
댓글