迴圈佇列----佇列的順序表示和實現
1.佇列的順序表示
1)C語言的描述
初始化建空對列時,令front=rear=0,每當插入新的隊尾元素時,“尾指標增1”;每當刪除佇列頭元素時,“頭指標增1”。因此,在非空佇列中,頭指標始終指向佇列頭元素,而尾指標始終指向佇列尾元素的下一位置,如圖所示。
2)存在問題
假設當前為佇列分配的最大空間為6,則當佇列處於圖3.12(d)的狀態時不可再繼續插入新的隊尾元素,否則會因陣列越界而遭致程式程式碼被破壞。然而此時又不宜如順序棧那樣,進行儲存再分配擴大陣列空間,因為佇列的實際儲存空間未佔滿。一個巧妙的辦法是將順序佇列臆造為一個環狀空間,稱之為迴圈佇列。
2.迴圈佇列的儲存結構
#define MAXQSIZE 100
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
3. 基本操作的函式原型
1)建立
Status InitQueue(SqQueue &Q);
操作結果:構造一個迴圈佇列Q
2)探空
int QueueEmpty(SqQueue Q);
操作結果:若Q為空,返回TRUE,否則返回FALSE
3)入隊
Status EnQueue(SqQueue &Q,QElemType e);
操作結果:插入元素e為新的隊尾元素
4)出隊
Status DeQueue(SqQueue &Q,QElemType &e);
操作結果:若佇列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK
否則返回ERROR
5)獲取隊頭元素
Status GetHead(SqQueue Q,QElemType &e);
操作結果:若佇列不空,則用e返回Q的隊頭元素,並返回OK;否則返回ERROR
6)求隊長
int QueueLength(SqQueue Q);
操作結果:返回隊中元素個數
7)清空
Status ClearQueue(SqQueue &Q);
操作結果:將Q清為空佇列
8)輸出隊中全部元素
void Print(SqQueue Q);
操作結果:輸出Q中的全部元素
9)銷燬
Status DestroyQueue(SqQueue &Q);
操作結果:銷燬佇列Q,Q不再存在
4.迴圈佇列及其基本操作示意圖
5.附錄(實現程式碼)
//----*----*----*---
//程式名稱:迴圈佇列
//編譯環境:VC++ 6.0
//作者:Bee_darker
//修改日期:2018-10-25
//----*----*----*---
#define OK 1
#define OVERFLOW -1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXQSIZE 100 //最大佇列長度
#include "stdio.h"
#include "stdlib.h"
typedef int Status;
typedef int QElemType;
typedef struct
{
QElemType *base; //初始化的動態分配儲存空間
int front; //頭指標,若佇列不空,指向佇列頭元素
int rear; //尾指標,若佇列不空,指向隊尾元素的下一位置
}SqQueue;
//建立
Status InitQueue(SqQueue &Q)
{
Q.base = (QElemType*)malloc(MAXQSIZE * sizeof(QElemType));
if(!Q.base)
exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
}
//判隊空
int QueueEmpty(SqQueue Q)
{
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}
//入隊
Status EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1) % MAXQSIZE == Q.front)
return ERROR; //佇列滿
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXQSIZE;
return OK;
}
//出隊
Status DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front == Q.rear)
return ERROR; //佇列為空
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXQSIZE;
return OK;
}
//獲取隊頭元素
Status GetHead(SqQueue Q,QElemType &e)
{
if(Q.front != Q.rear )
{
e = Q.base[Q.front];
return OK;
}
return ERROR;
}
//求隊長
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
//清空
Status ClearQueue(SqQueue &Q)
{
Q.front = Q.rear ;
return OK;
}
//輸出隊中全部元素
void Print(SqQueue Q)
{
if( Q.front == Q.rear)
printf("Empty Queue\n");
QElemType x;
printf("Q.front->");
while(Q.front != Q.rear)
{
x = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXQSIZE;
printf("%d->",x);
}
printf("Q.rear\n");
}
//銷燬
Status DestroyQueue(SqQueue &Q)
{
Q.base = NULL;
return OK;
}
int main()
{
SqQueue Q;
QElemType x;
QElemType y;
InitQueue(Q);
printf("QueueEmpty:%d\n",QueueEmpty(Q));
EnQueue(Q,1);
EnQueue(Q,2);
EnQueue(Q,3);
Print(Q);
printf("GetHead:%d\n",GetHead(Q,y));
printf("y:%d\n",y);
DeQueue(Q,x);
Print(Q);
ClearQueue(Q);
printf("QueueLength:%d\n",QueueLength(Q));
DestroyQueue(Q);
return 0;
}
6.測試結果