자 & 알/자료구조
[자료구조]스택(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