1. 程式人生 > >C 迴圈佇列實現

C 迴圈佇列實現

一個迴圈佇列的C語言實現,資料型別Queue定義如下,注意在 typedef struct{...}Queue; 中Queue為資料型別,而在struct {...}Queue; 中Queue為一個變數名。
front 為隊首元素下標,始終指向隊首元素,tail 為隊尾元素的下一個位置的下標。初始狀態為front=tail=0

typedef struct {
    int size,eleNum;
    int* array;
    int front,tail;  //front指向第一個元素,rear指向最後一個元素的下一個位置
} Queue;

基本操作有:
add(), 新增元素到隊尾
peek()

, 獲取但並不移出頭
poll(), 獲取並移出隊首元素
create(n), 建立大小為n的佇列
isempty(), 判斷佇列是不是空

另外,佇列操作函式的引數都為指標,這樣可以實現模擬引用傳遞的效果,如果引數為add(Queue q,int n), 對佇列的修改並不會影響到初始的佇列。可以修改執行試一下。

程式碼實現如下:


    #include<stdio.h>
    #include<stdlib.h>

    /*用c語音實現佇列基本操作
    add(), 新增元素到隊尾
    peek(), 獲取但並不移出頭
    poll(), 獲取並移出隊首元素
    create(n), 建立大小為n的佇列
    isempty(), 判斷佇列是不是空
    */
typedef struct { int size,eleNum; int* array; int front,tail; //front指向第一個元素,rear指向最後一個元素的下一個位置 } Queue; //取出並移除第一個元素 int poll(Queue* q){ int res = q->array[q->front]; q->front = (++(q->front))%q->size; q->eleNum--; return
res; } //獲取長度 int len(Queue* q){ return q->eleNum; } //插入k,返回1表示插入成功 int add(Queue* q,int k){ if(q->size==q->eleNum){ return 0; } q->eleNum++; q->array[q->tail] = k; q->tail = (q->tail+1) % q->size; return 1; } //取出頭部元素,不刪除此元素,peek是“偷看”的意思 int peek(Queue* q){ return q->array[q->front]; } //返回1表示為空,0表示不空 int isEmpty(Queue* q){ if(q->eleNum==0){ return 1; } return 0; } //建立大小為n的佇列 Queue* createQue(int n){ Queue* que = (Queue*)malloc(sizeof(Queue)); que->size = n; que->eleNum = 0; que->array = (int*)malloc(sizeof(int)*n); que->front = 0; que->tail = 0; return que; } void display(Queue* q){ int i = q->front; printf("elements: "); while(i!=q->tail){ printf("%d ",q->array[i]); i = (i+1)%q->size; } printf("\n"); printf("size: %d,elements num: %d\n",q->size,q->eleNum); printf("front: %d, tail:%d \n",q->front,q->tail); } int main(){ Queue* q = createQue(10); add(q,10); add(q,11); add(q,12); poll(q); poll(q); display(q); return EXIT_SUCCESS; }