본문 바로가기
Data Structure

C++ Stack 만들기 (version.3.3 - LinkedList Stack)

by SuldenLion 2023. 3. 19.
반응형

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()로 고쳐준다.

반응형

댓글