一種能夠實現"先進先出"的存儲結構算法
分類:數組
循環隊列的講解:code
靜態隊列爲何是循環隊列隊列
減小對內存的浪費內存
循環隊列須要幾個參數來肯定it
兩個參數,frant 、rear 但這2個參數不一樣場合有不一樣的含義,建議初學者先記住io
循環隊列各個參數的含義class
隊列初始化:front和rear的值都是零循環
隊列非空:front表明隊列的第一個元素,rear表明隊列的最後一個有效元素的下一個元素queue
隊列空:front和rear的值相等,但不必定是零
循環隊列入隊僞算法
將值存入rear所表明的位置
錯誤的寫法:r = r + 1
正確的應該是r = (r+1)%數組長度
循環隊列出隊僞算法
front = (front+1)%數組長度
如何判斷循環隊列是否爲空
若是front和rear的值相等,則隊列爲空
如何判斷循環隊列已滿
多增長一個表標識的參數
少用一個元素,一般都是這樣:(rear+1) % 數組長度 == front
具體的實現
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef struct Queue { int * pBase; int front; int rear; }QUEUE; void init(QUEUE *); bool full_queue(QUEUE *); bool empty(QUEUE *); bool en_queue(QUEUE * , int val); // 入隊 void traverse(QUEUE *); bool out(QUEUE *, int * pVal); int main(void) { QUEUE Q; int val; init(&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); en_queue(&Q , 7); traverse(&Q); if (out(&Q , &val)) { printf("出隊成功,出隊的元素:%d\n", val); en_queue(&Q , 9); traverse(&Q); } else { printf("出隊失敗\n"); } return 0; } void init(QUEUE * pQ) { pQ->pBase = (int *)malloc(sizeof(int) * 6); // 初始化默認是長度是6 if (NULL == pQ->pBase) { printf("初始化失敗\n"); exit(-1); } pQ->front = 0; pQ->rear = 0; } bool full_queue(QUEUE *pQ) { if ((pQ->rear+1)%6 == pQ->front) { return true; } else { return false; } } bool en_queue(QUEUE *pQ , int val) { if (full_queue(pQ)) { return false; } else { pQ->pBase[pQ->rear] = val; pQ->rear = (pQ->rear+1)%6; return true; } } void traverse(QUEUE * pQ) { int i = pQ->front; while(i != pQ->rear) { printf("%d\n",pQ->pBase[i] ); i = (i+1) % 6; } return; } bool empty(QUEUE * pQ) { if (pQ->front == pQ->rear) { return true; } else { return false; } } bool out(QUEUE * pQ, int * pVal) { if (empty(pQ)) { return false; } else { *pVal = pQ->pBase[pQ->front]; pQ->front = (pQ->front+1) % 6; return true; } }
隊列的應用