資料結構---順序儲存的迴圈佇列
阿新 • • 發佈:2018-12-18
佇列的定義
佇列是隻允許在一端進行插入操作,在另一端進行刪除操作的線性表,允許插入(也稱入隊,進隊)的一端叫隊尾,允許刪除(也叫出隊)的一端叫做對頭,佇列具有先進先出的特點。
在順序佇列中,隨著佇列的插入刪除操作,整個佇列向陣列中下標較大的位置移動,從而產生佇列的單向移動性。當元素被插入到陣列中下標最大的位置時,陣列的空間就用完了,儘管此時陣列的低端還有空閒空間,這種現象叫假溢位。 為了解決這種假溢位,可以將儲存佇列的陣列看做成頭尾相接的迴圈結構,即循序佇列。
順序儲存的迴圈佇列
#include<stdio.h> #include<stdlib.h> //定義陣列的最大長度 #define QueueSize 100 //定義佇列元素的資料型別,為int typedef int DataType; typedef struct { DataType data[QueueSize]; int front; int rear; }CirQueue; //迴圈佇列的初始化 void InitQueue(CirQueue ** Q){ (*Q)->front = (*Q)->rear = QueueSize-1; } //迴圈佇列的銷燬:迴圈佇列是靜態儲存分配, //在迴圈佇列變數退出作用域自動釋放所佔記憶體單元,順序儲存的迴圈佇列無需銷燬 //入隊操作 int EnQueue(CirQueue ** Q , DataType x){ if(((*Q)->rear + 1)%QueueSize == (*Q)->front){ printf("上溢錯誤,入隊失敗"); return 0; } //隊尾位置在迴圈意義上加1 (*Q)->rear = ((*Q)->rear + 1) % QueueSize; //在隊尾插入元素 (*Q)->data[(*Q)->rear] = x; return 1; } //出隊操作 int DeQueue(CirQueue ** Q,DataType * ptr){ if((*Q)->rear == (*Q)->front){ printf("下溢錯誤,刪除失敗"); return 0; } (*Q)->front = ((*Q)->front + 1)%QueueSize; *ptr = (*Q)->data[(*Q)->front]; return 1; } int GetHead(CirQueue * Q,DataType * ptr){ int i; if(Q->rear == Q->front){ printf("下溢錯誤,取隊頭失敗"); } i = (Q->front + 1)%QueueSize; *ptr = Q->data[i]; return 1; } int Empty(CirQueue * Q) { if(Q->rear == Q->front){ return 1; }else{ return 0; } } int main(){ DataType x; CirQueue * Q; InitQueue(&Q); EnQueue(&Q,5); EnQueue(&Q,4); EnQueue(&Q,3); EnQueue(&Q,2); EnQueue(&Q,1); if(GetHead(Q,&x) == 1) printf("當前隊頭元素為:%d\n",x); if(DeQueue(&Q,&x) == 1) printf("執行一次出隊操作,出隊元素為%d\n",x); if(GetHead(Q,&x) == 1) printf("當前隊頭元素為:%d\n",x); if(DeQueue(&Q,&x) == 1) printf("執行一次出隊操作,出隊元素為%d\n",x); if(GetHead(Q,&x) == 1) printf("當前隊頭元素為:%d\n",x); if(Empty(Q) == 1){ printf("佇列為空\n"); }else{ printf("佇列非空\n"); } return 0; } ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181028165935250.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N6eGxqeTk5OQ==,size_27,color_FFFFFF,t_70)