스택 자료구조에 대해 이해하고 있으면 쉽게 해결할 수 있는 문제입니다.
해당 코드는 Stack 클래스를 직접 구현해 해결했습니다. 이왕 구현하는거 대학 강의에서 배운 내용을 활용해보고자 template을 활용해 Stack을 구현했습니다.
그러나, Pop이나 Top같은 함수에서 stack이 비어있는 경우 -1을 반환하도록 되어있어 해당 함수는 int 자료형에 의존적이기에 만약 진짜 stack 자료구조를 구현한다면 해결해야 합니다.
#include <iostream>
#include <string>
template <typename T>
class Stack
{
public:
Stack();
~Stack();
void Init(int n);
void Push(T val);
T Pop();
int Size();
int Empty();
T Top();
private:
T* _stack;
int _top = 0;
};
template<typename T>
Stack<T>::Stack()
{
}
template<typename T>
Stack<T>::~Stack()
{
delete[] _stack;
}
template<typename T>
void Stack<T>::Init(int n)
{
_stack = new T[n];
_top = 0;
}
template<typename T>
void Stack<T>::Push(T val)
{
_stack[_top++] = val;
}
template<typename T>
T Stack<T>::Pop()
{
if (_top == 0) return -1;
int result = _stack[_top - 1];
_top--;
return result;
}
template<typename T>
int Stack<T>::Size()
{
return _top;
}
template<typename T>
int Stack<T>::Empty()
{
if (_top == 0)
return 1;
else
return 0;
}
template<typename T>
T Stack<T>::Top()
{
if (_top == 0)
return -1;
else
return _stack[_top - 1];
}
int main()
{
int n;
std::cin >> n;
Stack<int> _stack;
_stack.Init(n);
for (int i = 0; i < n; i++)
{
std::string in;
std::cin >> in;
if (in.compare("push") == 0)
{
int temp;
std::cin >> temp;
_stack.Push(temp);
}
else if (in.compare("pop") == 0)
{
std::cout << _stack.Pop() << "\n";
}
else if (in.compare("size") == 0)
{
std::cout << _stack.Size() << "\n";
}
else if (in.compare("empty") == 0)
{
std::cout << _stack.Empty() << "\n";
}
else if (in.compare("top") == 0)
{
std::cout << _stack.Top() << "\n";
}
}
return 0;
}