1. 程式人生 > >資料結構——迴圈佇列(動態分配空間)基本運算

資料結構——迴圈佇列(動態分配空間)基本運算

程式碼主要來源:【資料結構】【清華大學】【嚴蔚敏】

迴圈佇列基本運算如下:
(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釋放佇列成功!"); } }