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

[C++] Queue 직접 구현

taene_ 2023. 10. 22. 22:11

<연결 리스트로 Queue 구현>

//LinkedList Queue
#include <iostream> 
using namespace std;

template <typename T>
class Queue
{
public:
	struct Node
	{
		T data;
		Node* next;
		Node(T _data)
		{
			data = _data;
			next = nullptr;
		}
	};
	Queue() :mHead(nullptr) {}
	~Queue() {}
	void Push_back(T value)
	{
		Node* t = new Node(value);
		if (mHead == nullptr)
			mHead = t;
		else
		{
			Node* p = mHead;
			for (p; p->next != nullptr; p = p->next) {}
			p->next = t;
		}
	}
	void Push_front(T value)
	{
		Node* t = new Node(value);
		if (mHead == nullptr)
			mHead = t;
		else
		{
			t->next = mHead;
			mHead = t;
		}
	}
	void Pop()
	{
		if (mHead == nullptr)
			return;

		Node* p = mHead;
		mHead = p->next;
		delete p;
	}
	int Size()
	{
		int cnt = 0;
		Node* t = mHead;
		for (t; t != nullptr; t = t->next)
		{
			cnt++;
		}
		return cnt;
	}
	void Front()
	{
		cout << mHead->data << '\n';
	}
	void Back()
	{
		Node* mTail = mHead;
		for (; mTail->next != nullptr; mTail = mTail->next) {}
		cout << mTail->data << '\n';
	}
	bool Empty()
	{
		if (Size() == 0)
			return true;
		else
			return false;
	}
	void Print()
	{
		Node* t = mHead;
		for (; t != nullptr; t = t->next)
		{
			cout << t->data << ' ';
		}
		cout << '\n';
	}

private:
	Node* mHead;
};

int main()
{
	Queue<int> q;
	q.Push_back(5);
	q.Push_back(3);
	q.Push_back(2);
	q.Front();	//5
	q.Push_front(6);	//6 5 3 2
	q.Print();
	cout << q.Empty() << '\n';	//0 (비어있지않음)
	q.Front();	//6
	q.Back();	//2
	cout << q.Size() << '\n';	//4
	q.Pop();
	q.Pop();
	q.Pop();
	q.Pop();
	cout << q.Size() << '\n';	//0
	cout << q.Empty() << '\n';	//1 (비어있음)

	return 0;
}

 

<배열로 Queue 구현>

//Array Queue
#include<iostream>
using namespace std;

template <typename T> 
class Queue
{
public:
	Queue() : mHead(0), mTail(0), mSize(3), mArr(new T[mSize]{}) {}
	void Enqueue(T data) 
	{
		mArr[mTail] = data;
		mTail = (mTail + 1) % mSize;

		if (mTail == mHead) 
		{
			T* newArr = new T[mSize * 2]{};
			T* t = mArr;
			for (int i = 0; i < mSize; i++)
				newArr[i] = mArr[(mHead + i) % mSize];
			mArr = newArr;
			delete t;

			mHead = 0;
			mTail = mSize;
			mSize *= 2;
		}
	}
	T Front() 
	{
		return mArr[mHead];
	}
	void Dequeue() 
	{
		mArr[mHead++] = 0;
	}
	void Print() 
	{
		for (int i = mHead; i < mTail; i++)
			cout << mArr[i] << " ";
		cout << "\n";
	}
	int Size()
	{
		return mTail - mHead;
	}
	bool Empty()
	{
		if (Size() == 0)
			return true;
		else
			return false;
	}

private:
	int mHead, mTail, mSize;
	T* mArr;
};
int main() 
{
	Queue<int> q;
	q.Enqueue(5);
	q.Enqueue(3);
	q.Enqueue(2);
	q.Enqueue(1);
	cout << q.Size() << '\n';
	q.Print();
	q.Dequeue();
	q.Dequeue();
	q.Dequeue();
	q.Print();
	q.Enqueue(2);
	q.Enqueue(2);
	q.Enqueue(2);
	q.Enqueue(2);
	q.Enqueue(2);
	q.Enqueue(2);
	q.Print();
	q.Dequeue();
	q.Print();

	return 0;
}