한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 자료구조
스택은 LIFO(Last In First Out, 후입선출)을 따른다. 즉, 가장 최근에 스택에 추가한 항목이 가장 먼저 제거될 항목이다.
문제의 종류에 따라 배열보다 스택에 데이터를 저장하는 것이 더 적합한 방법일 수 있다.
#include <iostream>
#define MAXVALUE 2
using namespace std;
template<class T> class Stack
{
public:
int top; // 가장 위에 있는 원소
int size; // 현재 스택에 들어와있는 원소 개수
T *values;
Stack(){
size = MAXVALUE;
values = new T[size];
top = -1;
}
~Stack(){
delete[] value;
}
void push(T value){
if(!isFull())
values[++top] = value;
else
cout << 'Stack is Full' <<endl;
}
T Top()
{
if(!empty())
return values[top];
else
return NULL;
}
bool empty()
{
if(top < 0)
return true;
else
return false;
}
bool isFull()
{
if(top+1 == size)
return true;
else
return false;
}
};
template<typename T>
ostream& operator <<(ostream &out, Stack<T> &st){
T *temp = st.values;
out << "┌───┐" <<endl;
for(int i=st.top; i>=0; i--){
out <<" "<<temp[i]<< endl;
}
out << "└───┘" << endl;
return out;
}
int main()
{
Stack<int> st;
cout << "Stack push" << endl;
st.push(1);
cout << st << endl;
cout << "Stack push" << endl;
st.push(3);
cout << st << endl;
cout << "Stack push" << endl;
st.push(5);
cout << st <<endl;
cout << "Stack Top : " <<st.Top() << endl << endl;
cout << "Stack pop" << endl;
st.pop();
cout << st << endl;
st.pop();
cout << "Stack pop" << endl;
cout << st << endl;
st.pop();
cout << "Stack pop" << endl;
cout << st << endl;
}
template <class T>
ostream& operator<<(ostream& os, stack<T>& S){
// os << "top= "<<s.top<<endl;
// for(int i=0;i<=s.top;i++)os<<i<<":"<<s.stack[i]<<endl;
stack<T> s2; //역으로 출력하기 위해 임시스택 s2 이용
while(!s.empty()) {s2.push(s.top()); s.pop();}
while(!s2.empty()) {os<<"->"<<s2.top; s.push(s2.top()); s2.pop();}
return os;
}
재귀 알고리즘을 사용하는 경우 스택이 유용하다.