迴圈佇列—陣列實現
阿新 • • 發佈:2020-11-01
#include <stdio.h>
#include <stdlib.h>
/********************************/
/****** 迴圈佇列的操作 *******/
/******************************/
/* 結構體變數 */ typedef struct Queue { int * p; int front; int rear; }QUEUE; /* 函式宣告 */ void init(QUEUE * ); //迴圈佇列初始化 bool en_queue(QUEUE * , int); //入隊 bool out_queue(QUEUE * , int * ); //出隊 void traverse_queue(QUEUE * ); //遍歷 bool empty_queue(QUEUE * ); //判斷佇列是否為空 bool full_queue(QUEUE * ); //判斷佇列是否滿
/* 主函式 */ int main() { 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); printf("入隊後佇列的值分別是:\n"); traverse_queue(&Q); if(out_queue(&Q, &val)) //val用來儲存出隊的值【傳地址】 { printf("\n出隊成功!出隊的值為: %d\n", val); } else { printf("\n出隊失敗!\n"); } printf("\n出隊後佇列的值分別是:\n"); traverse_queue(&Q); return 0; }
/* 函式呼叫 */ /*——————————————————————————————————————————————————————*/ void init(QUEUE * pQ) { pQ->p = (int * )malloc(sizeof(int)*6); //動態構造一個數組,p相當於陣列首地址【即變數名】 pQ->front = 0; pQ->rear = 0; //佇列初始化,font和rear的值都是零 } bool en_queue(QUEUE * pQ, int Val) { if(full_queue(pQ)) { return false; } else { pQ->p[pQ->rear] = Val; //需要入隊的值 pQ->rear = (pQ->rear+1)%6; //入隊的演算法 return true; } } /*——————————————————————————————————————————————————————*/ bool full_queue(QUEUE * pQ) { if( ( pQ->rear+1 )%6 == pQ->front ) //if((r+l)% 陣列長度 == f) 則佇列已滿 { return true; } else { return false; } } /*——————————————————————————————————————————————————————*/ void traverse_queue(QUEUE * pQ) { int i = pQ->front; //遍歷時不能改變front的指向,因此用另一個變數代替 while(i != pQ->rear) { printf("%d ", pQ->p[i]); i = (i+1)%6; //迴圈條件 } printf("\n"); return; } /*——————————————————————————————————————————————————————*/ bool out_queue(QUEUE * pQ, int * pVal) { if(empty_queue(pQ)) { return false; } else { *pVal = pQ->p[pQ->front]; //*pVal <==> val【用來儲存出隊的值】 pQ->front = (pQ->front+1)%6;//出隊的演算法 return true; } } /*——————————————————————————————————————————————————————*/ bool empty_queue(QUEUE * pQ) { if(pQ->front == pQ->rear)//如果front與rear的值相等,則該佇列就一定為空 { return true; } else { return false; } } /*——————————————————————————————————————————————————————*/