1. 程式人生 > 其它 >資料結構之線性結構應用之一----佇列

資料結構之線性結構應用之一----佇列

佇列(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; }

五、佇列基本應用

  所有和時間有關的操作都與佇列有關,可以見到和排隊有關的影子。