資料結構——迴圈佇列(動態分配空間)基本運算
阿新 • • 發佈:2018-12-03
程式碼主要來源:【資料結構】【清華大學】【嚴蔚敏】
迴圈佇列基本運算如下:
(1)初始化佇列Q
(2)依次進佇列元素a,b,c
(3)佇列為非空
(4)出隊一個元素a
(5)依次進佇列元素d,e,f
(6)出佇列序列:b c d e f
(7)釋放佇列
完整程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define TRUE 1
#define FALSE 0
#define MAXQSIZE 10 // 最大佇列長度(對於迴圈佇列,最大佇列長度要減1),因為要考慮棧滿判斷條件
typedef char QElemType;
typedef int Status;
typedef struct SqQueue {
QElemType *base; // 初始化的動態分配儲存空間
int front; // 頭指標,若佇列不空,指向佇列頭元素
int rear; // 尾指標,若佇列不空,指向佇列尾元素的下一個位置
} SqQueue;
Status InitQueue(SqQueue &Q)
{
// 構造一個空佇列Q
Q.base=(QElemType * )malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base) // 儲存分配失敗
exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
Status DestroyQueue(SqQueue &Q)
{
// 銷燬佇列Q,Q不再存在
if(Q.base)
free(Q.base);
Q.base=NULL;
Q.front=Q.rear=0;
return OK;
}
Status QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}
int QueueLength(SqQueue Q)
{
// 返回Q的元素個數,即佇列的長度
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status EnQueue(SqQueue &Q,QElemType e)
{
// 插入元素e為Q的新的隊尾元素
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)
{
// 若佇列不空,則刪除Q的隊頭元素,用e返回其值,並返回OK;否則返回ERROR
if(Q.front==Q.rear) // 佇列空
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
int main()
{
SqQueue Q;
InitQueue(Q);
char q1[3]={'a','b','c'};
char q2[3]={'d','e','f'};
int i;
char e;
printf("依次進佇列元素a,b,c\n");
for(i=0;i<3;i++)
{
EnQueue(Q,q1[i]);
}
if(!QueueEmpty(Q))
{
printf("此時棧非空\n");
}
DeQueue(Q,e);
printf("出隊一個元素:%c\n",e);
printf("依次進佇列元素d,e,f\n");
for(i=0;i<3;i++)
{
EnQueue(Q,q2[i]);
}
printf("出隊序列為:");
while(!QueueEmpty(Q))
{
DeQueue(Q,e);
printf("%c ",e);
}
if(DestroyQueue(Q))
{
printf("\n釋放佇列成功!");
}
}