資料結構之線性結構應用之一----佇列
阿新 • • 發佈:2021-08-16
佇列(queue)
一、定義
一種可以實現“先進先出”的儲存結構,即先進入佇列的資料先取出來。
二、分類
- 鏈式佇列:連結串列實現,實現難度比靜態佇列低很多
- 靜態佇列:陣列實現,靜態佇列通常都必須是迴圈佇列
三、程式實現前該解決的問題
(1)靜態佇列為什麼必須是迴圈佇列?
因為front、rear兩個都只能只增不減,為了充分利用陣列靜態的記憶體,故採用迴圈佇列。使用求餘號%解決。
(2)迴圈佇列需要幾個引數來確定?
需要兩個引數:front、rear,兩個引數不同場合有不同的含義
四、靜態佇列基本操作
- 入隊偽演算法:
1.將值存入rear所代表的位置;
2.正確的寫法:r=(r+1)%陣列長度,實現迴圈移動
- 出隊偽演算法:
1.將front所代表的位置取出
2.f=(f+1)%陣列長度
- 判空/滿
程式實現:
#include<stdio.h> #include<malloc.h> typedef struct Queue { int *pBase; int front; int rear; }QUEUE,*PQUEUE; void init_queue(PQUEUE); int en_queue(PQUEUE,int); int out_queue(PQUEUE,int *); void traverse_queue(PQUEUE);int is_full_queue(PQUEUE); int is_empty_queue(PQUEUE); int main() { QUEUE Q; int val; init_queue(&Q); en_queue(&Q,1); en_queue(&Q,2); en_queue(&Q,3); en_queue(&Q,4); en_queue(&Q,5); en_queue(&Q,6); traverse_queue(&Q); out_queue(&Q,&val); printf("出棧:%d\n",val); traverse_queue(&Q); return 0; } void init_queue(PQUEUE pQ) { pQ->pBase=(int *)malloc(sizeof(int)*6); pQ->front=0; pQ->rear=0; } int en_queue(PQUEUE pQ,int val) { if(is_full_queue(pQ)) return 0; *(pQ->pBase+pQ->rear)=val; pQ->rear=(pQ->rear+1)%6; return 1; } int is_full_queue(PQUEUE pQ) { if((pQ->rear+1)%6==pQ->front) return 1; return 0; } void traverse_queue(PQUEUE pQ) { int i=pQ->front; while(i!=pQ->rear) { printf("%d ",*(pQ->pBase+i)); i=(i+1)%6; } printf("\n"); return; } int is_empty_queue(PQUEUE pQ) { if(pQ->rear == pQ->front) return 1; return 0; } int out_queue(PQUEUE pQ,int *val) { if(is_empty_queue(pQ)) { printf("空\n"); return 0; } else { *val=*(pQ->pBase+pQ->front); pQ->front=(pQ->front+1)%6; } return 1; }
五、佇列基本應用
所有和時間有關的操作都與佇列有關,可以見到和排隊有關的影子。