迴圈佇列優化版—陣列實現
阿新 • • 發佈:2020-11-19
/********************************/
/*** 迴圈佇列的操作優化版 ***/
/******************************/
#include <stdio.h> #include <stdlib.h> #define Maxsize 5 //陣列最多5個元素 typedef struct Queue { int * p; //維護一維陣列,陣列名 int front;//第一個元素的下標 int rear; //尾部元素的後一個元素的下標 }Queue; /* 函式宣告 */ void test01(); void InitQueue(Queue * ); //1. 迴圈佇列初始化 void EnQueue(Queue * , int); //2. 入隊 void TraverseQueue(Queue * ); //3. 遍歷 void OutQueue(Queue * , int * ); //4. 出隊
int main()
{
test01();
system("pause");
return 0;
}
void test01() { int n, m, e; Queue Q; InitQueue(&Q); printf("請輸入元素的個數:\n"); scanf("%d", &n); printf("依次輸入元素:\n"); while(n--) { scanf("%d", &m); EnQueue(&Q, m); } printf("遍歷元素:\n"); TraverseQueue(&Q); printf("元素依次出隊:\n"); while(Q.rear != Q.front) { OutQueue(&Q, &e); printf("%d ", e); } printf("\n"); }
//1. 迴圈佇列初始化 void InitQueue(Queue * q) { q->p = (int * )malloc(sizeof(int) * Maxsize); //動態構造一個數組,p相當於陣列首地址【即變數名】 //佇列初始化,font和rear的值都是零 q->front = 0; q->rear = 0; } //2. 入隊 void EnQueue(Queue * q, int val) { if(( q->rear+1 ) % Maxsize == q->front)//佇列滿 { return; } q->p[q->rear] = val; //需要入隊的值 q->rear = (q->rear+1) % Maxsize; //下標後移一位 } //3. 遍歷 void TraverseQueue(Queue * q) { int i = q->front; //遍歷時不能改變front的指向,因此用另一個變數代替 while(i != q->rear) { printf("%d ", q->p[i]); i = (i+1) % Maxsize; //下標後移一位 } printf("\n"); } //4. 出隊 void OutQueue(Queue * q, int * val) { if(q->front == q->rear)//佇列為空 { return; } *val = q->p[q->front]; //*val <==> e【用來儲存出隊的值】 q->front = (q->front+1) % Maxsize;//下標後移一位 }