백준 10828 - 스택

황재진·2024년 3월 18일

백준

목록 보기
28/54
post-thumbnail

스택 자료구조에 대해 이해하고 있으면 쉽게 해결할 수 있는 문제입니다.

해당 코드는 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;
}
profile
프로그래밍, 쉐이더 등 이것저것 다해보는 게임 개발자입니다

0개의 댓글