C++ 개념 공부/자료구조

[C++] Stack 직접 구현

taene_ 2023. 10. 22. 22:12

<Stack>

//Stack
#include <iostream> 
using namespace std;

template <typename T>
class Stack
{
public:
	Stack() :mTop(0), mSize(3), mArr(new T[mSize]{}) {}
	~Stack() {}
	void Push(T value)
	{
		if (mTop == mSize)
		{
			T* t = mArr;
			T* newArr = new T[mSize * 2]{};
			for (int i = 0; i < mSize; i++)
			{
				newArr[i] = mArr[i];
			}
			delete t;
			t = nullptr;
			mArr = newArr;
			mSize = mSize * 2;
		}
		mArr[mTop++] = value;
	}
	void Pop()
	{
		if (mTop == 0)
			return;

		mArr[--mTop] = NULL;
 	}
	int Size()
	{
		return mTop;
	}
	bool Empty()
	{
		if (Size() == 0)
			return true;
		else
			return false;
	}
	void Print()
	{
		if (mTop == 0)
		{
			cout << "isEmpty" << '\n';
			return;
		}

		for (int i = 0; i < mTop; i++)
			cout << mArr[i] << ' ';
		cout << '\n';
	}

private:
	int mTop;
	int mSize;
	T* mArr;
};

int main()
{
	Stack<int> st;
	st.Push(5);
	st.Push(3);
	st.Push(2);
	st.Print();	//5 3 2
	cout << st.Size() << '\n';	//3
	cout << st.Empty() << '\n';	//0 (비어있지않음)
	st.Push(6);
	st.Pop();
	st.Pop();
	cout << st.Size() << '\n';	//2
	st.Print();	//5 3
	st.Pop();
	st.Pop();
	st.Print();	//isEmpty
	cout << st.Size() << '\n';	//0
	cout << st.Empty() << '\n';	//1 (비어있음)
	st.Pop();	//return

	return 0;
}