C語言實現隊(迴圈佇列)
阿新 • • 發佈:2019-01-08
之前用連結串列實現隊,這裡用陣列實迴圈佇列,今天又看了一下佇列,發現少了計算佇列長度的函式
佇列的實現程式碼,犧牲一個元素儲存空間
#include<stdbool.h> #define maxsize 10 typedef int datatype; //定義隊的結構體 struct queue { datatype data[maxsize]; int front; int rear; }; typedef struct queue Queue; //初始化隊 void init(Queue *q) { q->front=q->rear=0; } //判斷是否為空 //這裡有兩種方法 //先實現犧牲一個儲存空間的方法,即rear始終指向空 bool Empty(Queue *q) { if(q->front==q->rear) { return true; } else { return false; } } //判斷是否滿 bool full(Queue *q) { if((q->rear+1)%maxsize==q->front) { return true; } else { return false; } } //入隊 void Push(Queue *q,datatype element) { if(!full(q)) { q->data[q->rear]=element; q->rear=(q->rear+1)%maxsize; } else { printf("隊滿!\n"); } } //出隊 void Pop(Queue *q) { if(!Empty(q)) { q->front=(q->front+1)%maxsize; } else { printf("隊空\n"); } } //取隊頂元素 datatype Top(Queue *q) { if(!Empty(q)) { return q->data[q->front]; } else { printf("隊空\n"); } }
佇列的測試程式碼
#include<stdio.h> #include "CircleQueue.h" int main() { int i=0; Queue s; Queue *q=&s; // struct stack s; //初始化隊 printf("\n###########初始化隊###########\n"); init(q); printf("----------------------------------"); //入隊操作 printf("\n###########入隊操作###########\n"); for(i=2;i<=11;i++) { Push(q,i); } printf("----------------------------------"); //取隊頂元素 printf("\n###########取隊頂元素###########\n"); printf("%d\n",Top(q)); Pop(q); Pop(q); printf("----------------------------------"); //入隊操作 printf("\n###########入隊操作###########\n"); for(i=215;i<=219;i++) { Push(q,i); } printf("----------------------------------"); //出隊操作 printf("\n###########出隊操作###########\n"); for(i=0;i<=10;i++) { Pop(q); } printf("----------------------------------"); //取隊頂元素 printf("\n###########取隊頂元素###########\n"); Top(q); printf("----------------------------------"); // //銷燬隊 // printf("\n###########銷燬隊###########\n"); // Push(q,10); // Destroy(q); // Top(q); }
設定一個flag的方法,用flag區分隊空與非空
#include<stdbool.h> #define maxsize 10 typedef int datatype; //定義隊的結構體 struct queue { datatype data[maxsize]; int front; int rear; int flag; //flag=0時隊空,flag=1時隊非空 }; typedef struct queue Queue; //初始化隊 void init(Queue *q) { q->front=q->rear=0; q->flag=0; } //判斷是否為空 //這裡有兩種方法 //先實現犧牲一個儲存空間的方法,即rear始終指向空 bool Empty(Queue *q) { if(q->flag==0) { return true; } else { return false; } } //判斷是否滿 bool full(Queue *q) { if(!Empty(q)&&q->rear==q->front) { return true; } else { return false; } } //入隊 void Push(Queue *q,datatype element) { if(!full(q)) { q->data[q->rear]=element; q->rear=(q->rear+1)%maxsize; q->flag=1; } else { printf("隊滿!\n"); } } //出隊 void Pop(Queue *q) { if(!Empty(q)) { q->front=(q->front+1)%maxsize; if(q->front==q->rear) { q->flag=0; } } else { printf("隊空\n"); } } //取隊頂元素 datatype Top(Queue *q) { if(!Empty(q)) { return q->data[q->front]; } else { printf("隊空\n"); } }
或者這裡把flag改為隊長,那麼方法簡單,在每次入隊時加一個元素,出隊時減一個元素