隊列
隊列的類型定義
基本概念
只允許在一端插入數據操作,在另一端進行刪除數據操作的特殊線性表;進行插入操作的一端稱為隊尾(入隊列),進行刪除操作的一端稱為隊頭(出隊列);隊列具有先進先出(FIFO)的特性。
ADT Queue{
數據對象: D={ai|a1∈ElemSet,i=1,2,...,n,n>=0}
數據關系:R={<ai,ai-1>|ai∈D,i=1,2,...,n,n>=0}
約定其中ai為隊列頭,an為隊列尾
基本操作:
InitQueue(&Q)
造作結果:構造一個空隊列
DestroyQueue(&Q)
初始條件:隊列Q已存在
操作結果:隊列Q被銷毀,不再存在
ClearQueue(&Q)
初始條件:隊列Q已存在
操作結果:將Q清空為空隊列
QueueEmpty(Q)
初始條件:隊列Q已存在
操作結果:若Q為空隊列,返回true,否則,返回false
QueueLength(Q)
初始條件:隊列Q已存在
操作結果:返回Q的元素個數,即隊列的長度
GetHead(&Q)
初始條件:隊列Q已存在
操作結果:返回Q的頭元素
EnQueue(&Q,e)
初始條件:隊列Q已存在
操作結果:插入e為Q的新的隊尾元素
DeQueue(&Q,&e)
初始條件:Q為非空隊列
操作結果:刪除Q的對頭元素,並用e返回其值
QueueTraverse(Q)
初始條件:Q為非空隊列
操作結果:從對頭到對尾,依次對Q的每個數據元素訪問
}ADT Queue
循環隊列
為了改變假溢出所以使用循環隊列
順序表示
隊列順序存儲結構
#define MAXSIZE 100
typedef struct
{
QElemType *base;//存儲空間的基地址
int front;//頭指針
int rear;//尾指針
}SqQueue;
初始化
Status InitQueue(SqQueue&Q)
{
Q.base = new QELemType[MAXSIZE];
if(!Q.base) return ERROR;
Q.front = Q.rear = 0;
return OK;
}
銷毀隊列
Status DestoryQueue(SqQueue&Q)
{
if(Q.base)
delete []Q.base;
return OK;
}
清空隊列
Status ClearQueue(SqQueue&Q)
{
delete[] Q.base;
front = rear = 0;
elements = new T[maxSize];
}
判空
Status EmptyQueue(SqQueue&Q)
{
return (front == rear) ? true : false;
}
取隊長
int QueueLength(SqQueue Q)
{
return(Q.rear-Q.fornt+MAXSIZE)&MAXSIZE;
}
取對頭元素
Status GetHead(SqQueue&Q)
{
if(Q.front!=Q.rea)
return Q.base[Q.front];
}
入隊
Status EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXSIZE == Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;//隊尾指針加1
return OK;
}
出隊
Status DeQueue(SqQueue &Q,QElemtype &e)
{
if(Q.fornt==Q.rear)
return ERROR;
e=Q.base[Q.front];
Q.fornt=(Q.front+1)%MAXSIZE;//隊頭指針加1
return OK
}
遍歷隊列
Status QueueTraverse(SqQueue &Q)
{
int i;
i=Q.front;
while(i!=Q.rear)
{
printf("%d ",Q.data[i]);
i=(i+1)%MAXSIZE;
}
printf("\n");
return OK;
}