數據結構模板之七:環形隊

①基本定義

相比順序隊環形隊不會出現假溢出的現象(由於每次進隊操作時隊尾指針rear增1,而每次出隊時頭指針front也是增1,順序隊中的front與rear一直在逼近MaxSize,當rear=MaxSize-1時,此時“隊滿”,無法再進隊,但實際上隊列裏仍然有空位置)。

若把存放數據的數組“首尾相連”,將它視作一“環形數組”,假溢出的現象就能解決。

環形隊充分地利用了空間,但它也有缺陷,由於隊空和隊滿的條件一樣(q->front = q->rear),無法只通過這兩個指針的當前位置區分隊空和隊滿(下面解決);多次的進隊和出隊操作,出隊元素的空間可能會被新進隊的元素覆蓋。

②存儲方式與結構

可以將環形隊理解成一個首尾相連的順序隊,和順序隊不同,環形隊的隊首和隊尾指針初始化時都置爲0,隊尾和隊首指針採用求餘的方式增1(eg:front = (front+1)% MaxSize)。

③判斷隊空,隊滿的方式

1.犧牲一個元素空間(下文中採取的便是這種方式)

當q->rear+1)% MaxSize == q->front時,隊滿上溢出。

當q->front = q->rear時,隊空下溢出。

2.新增一個計數變量count實時統計隊中數量

將count初始化爲0,count爲0時,不允許出隊,隊空;count爲MaxSize時,不允許入隊,隊滿。

未引入計數變量求隊列中個數的方法:n(個數) = (rear - front + MaxSize)% MaxSize。

3.新增一個變量flag

初始時flag爲0,入隊成功時flag = 1,出隊成功時flag = 0。

q->front = q->rear  && flag == 0,隊空。

q->front = q->rear && flag == 1,隊滿。

④實現

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

#define MaxSize 50
typedef int ElemType;

typedef struct
{
	ElemType data[MaxSize];
	int flont,rear;
}SqQueue;                     //環形隊類型

/*****初始化隊列*****/
void InitQueue(SqQueue * &q)
{
	q=(SqQueue *)malloc(sizeof(SqQueue));
	q->flont=q->rear=0;
}

/*****銷燬隊列*****/
void DestroyQueue(SqQueue * &q)
{
	free(q);
}

/*****判斷隊列是否爲空*****/
bool QueueEmpty(SqQueue *q)
{
	return (q->flont==q->rear);
}

/*****進隊列*****/
bool enQueue(SqQueue * &q,ElemType e)
{
	if((q->rear+1)%MaxSize==q->flont)        //隊滿上溢出
		return false;
	q->rear=(q->rear+1)%MaxSize;
	q->data[q->rear]=e;
	return true;
}

/*****出隊列*****/
bool deQueue(SqQueue * &q,ElemType &e)
{
	if(q->flont==q->rear)                //隊空下溢出
		return false;
	q->flont=(q->flont+1)%MaxSize;
	e=q->data[q->flont];
	return true;
}

int main()
{
	return 0;
}
---代碼和部分內容參考自《數據結構教程》

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