推免複習之數據結構與算法 順序隊列

這一篇實現的是普通的順序隊列,實現很簡單,其實就是對線性表的限制,從隊首出隊,從隊尾入隊,缺點也很明顯,那就是假溢出現象,假溢出現象意思是明明還有空的空間,但是卻無法再往裏存數據了,主要是兩個遊標的移動導致的,因此爲了克服這個問題,在我的下一篇博客中我會實現一下環形隊列。

代碼實現如下,供參考:

#include<iostream>
#include<vector>
using namespace std;

class Queue
{
private:
	vector<int> q;
	int maxSize;
	int size;
	int front;
	int back;
public:
	Queue(int max);
	~Queue();
	bool enQueue(int value);
	bool deQueue();
	int getFront();
	bool isEmpty();
	void move();
};
Queue::Queue(int max=100)
{
	size = 0;
	front =0;
	back =0;
	maxSize = max;
	q = vector<int> (max);
}

bool Queue::enQueue(int value)
{
	size++;
	q[back++] = value;
	return true;
}
bool Queue::deQueue()
{
	if (size == 0)
	{
		return false;
	}
	else
	{
		front++;
		size--;
		return true;
	}
}
int Queue::getFront()
{
	if (size == 0)
	{
		return 0;
	}
	else
	{
		return q[front];
	}
}
bool Queue::isEmpty()
{
	if (size == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}
void Queue::move()
{
	if (size == 0)
	{
		front = 0;
		back = 0;
		return;
	}
	else
	{
		int length = front;
		for (int i = front; i <= back; i++)
		{
			q[i - length] = q[i];
		}
		front = 0;
		back = back - length;
		return;
	}
}

int main()
{
	Queue *queue = new Queue(5000);
	for (int i = 0; i < 5000; i++)
	{
		queue->enQueue(i);
	}
	for (int i = 0; i < 5000; i++)
	{
		cout << queue->getFront() << endl;
		queue->deQueue();
	}
	queue->move();  //否則會溢出
	for (int i = 0; i < 5000; i++)
	{
		queue->enQueue(i);
	}
	for (int i = 0; i < 5000; i++)
	{
		cout << queue->getFront() << endl;
		queue->deQueue();
	}
	system("pause");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章