1. 程式人生 > >資料結構--3.4佇列

資料結構--3.4佇列

基本操作:

入隊(enqueue):隊尾rear插入
出隊(dequeue):隊首front刪除

實現方式

連結串列實現:繼承自連結串列結構(本文略)
陣列實現:迴圈陣列,只要Rear或者Front達到陣列的尾端,他就繞回到開頭。

#include <iostream>
using namespace std;
typedef struct QueueRecord
{
	int m_capacity;
	int m_rear;
	int m_front;
	int m_size;
	int* m_arry;
}*Queue;

Queue CreatQueue(int capacity);
void Enqueue(Queue q, int x);
void Dequeue(Queue q);
bool IsFull(Queue q);
bool IsEmpty(Queue q);
void Traverse(Queue q);//隊首到隊尾遍歷
bool IsMakeEmpty(Queue q);
int main()
{
	Queue q = CreatQueue(5);
	Enqueue(q, 1);
	Enqueue(q, 2);
	Enqueue(q, 3);
	Traverse(q);
	cout << "出隊一次:" << endl;
	Dequeue(q);
	Traverse(q);
	cout << "將4入隊:" << endl;
	Enqueue(q, 4);
	Traverse(q);
	if (IsMakeEmpty(q))
		cout << "置空成功" << endl;
	Traverse(q);
	system("pause");
	return 0;
}

Queue CreatQueue(int capacity)
{
	Queue q = new QueueRecord;
	q->m_capacity = capacity;
	q->m_rear = -1;
	q->m_front = -1;
	q->m_size = 0;
	q->m_arry = new int[capacity];
	return q;
}

void Enqueue(Queue q, int x)
{
	if (!IsFull(q))
	{
		q->m_size++;
		q->m_rear++;
		q->m_arry[q->m_rear] = x;
	}
	else
		cout << "佇列已滿,無法入隊" << endl;
}

void Dequeue(Queue q)
{
	if (!IsEmpty(q))
	{
		q->m_size--;
		q->m_front++;
		q->m_rear--;
	}
	else
		cout << "佇列以空,無法出隊" << endl;
}

bool IsFull(Queue q)
{
	if (q->m_size == q->m_capacity)
		return true;
	return false;
}

bool IsEmpty(Queue q)
{
	if (q->m_size == 0)
		return true;
	return false;
}

void Traverse(Queue q)
{
	cout << "隊首到隊尾遍歷:" << endl;
	if (!IsEmpty(q))
	{
		int tmp = q->m_size;
		int i = 0;
		while (i < tmp)
		{
			cout << q->m_arry[i] << " ";
			i++;
		}
		cout << endl;
	}
	else
		cout << "佇列為空" << endl;
}

bool IsMakeEmpty(Queue q)
{
	if (q != nullptr)
	{
		q->m_size = 0;
		q->m_front = -1;
		q->m_rear = -1;
		return true;
	}
	else
		cout << "不佔空間的空棧" << endl;
}

應用:

1、作業送交給印表機;但是印表機可以刪除中間的佇列,違反了佇列的嚴格定義
但是,放到佇列未必最好,有時希望花費時間最長的作業放到最後,此時可以使用堆(優先佇列)。
2、PC機的網路設定,磁碟是放在一臺叫做檔案伺服器的機器上,使用者是根據先到先使用的原則訪問檔案,其資料結構為佇列
3、接線員對大公司的傳呼
4、在終端上的等待也是佇列

拓展

排隊論:處理這樣一類問題,用概率的方法計算使用者排隊預計等待時間,以及整個佇列能夠容納的處理時間。
答案依賴於使用者加入佇列的概率,以及加入佇列後處理服務花費的時間,這兩個引數作為概率分佈函式給出。