관리 메뉴

기억을 위한 기록들

[자료구조]스택(Stack) / C++ 템플릿 본문

자 & 알/자료구조

[자료구조]스택(Stack) / C++ 템플릿

에드윈H 2020. 8. 3. 23:12

이번엔 스택이다.

 

스택 쌓자

 

스택 클래스와 해당 스택에 쌓는 노드 클래스 2개의 클래스로 구성 되어 있다.

 

 

 

template<typename T>
class Node 
{

public:
	Node(T _data)
		: mData(_data)
	{};
    
	~Node() {
		delete mNextNode;
	};

	T mData; //현재 노드에 있는 데이터
	Node* mNextNode; //현재 노드의 다음 노드를 가리키는 포인터
};
template<typename T>
class Stack {
public:
	Stack() {};
	~Stack() {};

	void Push(T newItem);
	T Pop();
	T GetTopData();

	bool IsEmpty() const;
	int GetStackSize() const;

private:
	Node<T> * mTopNode; //현재 가장 위에 있는 노드를 가리키는 포인터
	int mStackSize = 0;
};

template<typename T>
int Stack<T>::GetStackSize() const
{
	return mStackSize;
}

template<typename T>
bool Stack<T>::IsEmpty() const
{
	return mTopNode == nullptr; //top(제일 위에 있는 노드)이 null인지 여부
}

template<typename T>
T Stack<T>::GetTopData()
{
	if (IsEmpty())  //비어 있지 않으면
	{
		return -1; //-1반환
	}

	return mTopNode->mData; //현재 top의 데이터를 반환한다.
}//end of Check

template<typename T>
void Stack<T>::Push(T _NewValue)
{

	Node<T> * newNode = new Node<T>(_NewValue); //추가 될 새로운 노드를 생성한다.

	newNode->mNextNode = mTopNode; //생성된 노드의 다음노드 = 현재 탑노드

	mTopNode = newNode; //탑 노드 갱신

	mStackSize++;

}//end of push


template<typename T>
T Stack<T>::Pop()
{
	if (IsEmpty())  //꺼낼노드 없으면 -1반환
		return -1;

	T beforeTopNode = mTopNode->mData; //가장 위 데이터 값 저장 

	mTopNode = mTopNode->mNextNode; // 탑노드= 다음 노드

	mStackSize--;
    
	return beforeTopNode; //가장 위 데이터 값 반환 
}//end of pop
#include <iostream>
using namespace std;


int main() {
	Stack<int> s;
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Push(4);

	int size = s.GetStackSize();

	for (int i = 0; i < size; i++)
		cout << "꺼낸숫자 : " << s.Pop() << endl;


	return 0;
}//end of main