①基本定義
相比順序隊,環形隊不會出現假溢出的現象(由於每次進隊操作時隊尾指針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;
}
---代碼和部分內容參考自《數據結構教程》