C語言實現迴圈佇列的初始化&進隊&出隊&讀取隊頭元素&判空-2
阿新 • • 發佈:2018-12-22
/*順序表實現佇列的一系列操作(設定flag標誌不損失陣列空間)*/ #include<stdio.h> #include<stdlib.h> #define Queue_Size 50 //佇列的最大長度 #define OK 1 #define ERROR 0 typedef struct { int elem[Queue_Size]; //佇列的元素空間 int front; //頭指標指示器 int rear; //尾指標指示器 int flag; //flag,判斷佇列是否為空的標誌 }SeqQueue; /**********************各個子函式的定義*********************/ void initQueue(SeqQueue *Q); //迴圈佇列初始化 int enterQueue(SeqQueue *Q,int n); //迴圈佇列入隊操作 void deleteQueue(SeqQueue *Q); //迴圈隊列出隊操作 int isEmpty(SeqQueue *Q); //判斷佇列是否為空 int getHead(SeqQueue *Q,int *x); //讀取佇列的隊頭元素 ,指標x指向隊頭元素 int main(){ SeqQueue Q; int choice; while(true) //迴圈佇列操作選擇選單 { printf("*****************Please enter your choice*****************\n\n"); printf(" choice 1:Queue initialization\n"); printf(" choice 2:Into the queue\n"); printf(" choice 3:Out of the queue\n"); printf(" choice 4:Determine whether the queue is empty\n"); printf(" choice 5:Get queue head\n"); printf(" choice 0:exit\n\n"); scanf("%d",&choice); switch(choice) { case 1: initQueue(&Q); break; case 2: int n; printf("Please enter the number into the queue elements:"); scanf("%d",&n); //讀入存入的佇列元素個數 //三目運算子根據返回值判斷元素是否進隊成功 (enterQueue(&Q,n)==1)?printf("%d個元素依次進隊成功\n",n):printf("%d個元素依次進隊失敗\n",n); break; case 3: deleteQueue(&Q); break; case 4: //三目運算子根據返回值判斷佇列是否為空 (isEmpty(&Q)==1)?printf("An empty Queue\n"):printf("Not an empty Queue\n"); break; case 5: //三目運算子根據返回值判斷隊頭元素是否讀取成功 int x; (getHead(&Q,&x)==0)?printf("An empty Queue error!!!!\n"):printf("Get head successful,隊頭元素為:%d\n",x); break; case 0: exit(0); break; default: printf("ERROR!!\n"); exit(0); break; } } return 0; } /**********************各個子函式功能的實現*********************/ void initQueue(SeqQueue *Q) { //將 *Q 初始化為一個空的迴圈佇列 Q->front=Q->rear=0; Q->flag=0; } int enterQueue(SeqQueue *Q,int n) //進佇列 { //將元素n入隊 int n1,n2; if((Q->front==Q->rear)&&(Q->flag==1)) return ERROR; //標誌佇列已經滿了 printf("Please enter into the queue elements in turn:\n"); for(n1=0;n1<n;n1++) //迴圈輸入元素進入佇列 { scanf("%d",&n2); Q->elem[Q->rear]=n2; Q->rear=(Q->rear+1)%Queue_Size; //重新設定隊尾指標 if(Q->front==Q->rear) //此處有兩種情況:1.元素沒有全部進入佇列,空間已經滿了 2.元素全部進入佇列,空間剛剛好好 { Q->flag=1; //flag=1:佇列空間存滿 return ERROR; } } return OK; } void deleteQueue(SeqQueue *Q) { //刪除佇列的隊頭元素 int a; if((Q->front==Q->rear)&&(Q->flag==0)) //佇列為空,刪除失敗 { printf("An empty Queue error!!!!\n"); } else { a=Q->elem[Q->front]; //刪除前先讀取隊頭元素 Q->front=(Q->front+1)%Queue_Size; //重新設定隊頭指標 printf("隊頂元素%d出隊成功.\n",a); //操作成功 if(Q->front==Q->rear) Q->flag=0; //flag=0:佇列中的元素全部出隊 } } int isEmpty(SeqQueue *Q) { if((Q->front==Q->rear)&&(Q->flag==0)) { //判斷佇列為空,返回OK return OK; } return ERROR; //否則返回ERROR } int getHead(SeqQueue *Q,int *x) { if((Q->front==Q->rear)&&(Q->flag==0)) { //佇列為空,讀取失敗 return ERROR; } else { *x=Q->elem[Q->front]; //操作成功 return OK; } }