C語言 順序隊列及循環隊列的基本操作


一、隊列的定義

隊列是一種運算受限制的線性表,它與堆棧的不同之處在於元素的添加在表的一端進行,而元素的刪除在另一端進行。允許添加元素的一端稱為隊尾,允許刪除元素的一端稱為隊頭。隊列的特點是先進先出,后進后出,所以隊列也稱先進先出表。

二、順序隊列

與堆棧類似,隊列最簡單的表示方式是采用一維數組,設數組為data,其下標下界為0,上界為MAXSIZE-1.

                                       一維數組隊列

a b c d e  

                                 ↑front              ↑rear

基本操作如下:

(1)順序隊列的初始化:

1 //順序隊列的初始化 
2 void InitQueue(sQqueue *q){
3     q->front=0;
4     q->rear=0;
5 }

(2)求順序隊列的長度:

1 //求順序隊列的長度 
2 int QueueLength(sQqueue *q){
3     int length=(q->rear-q->front+MAXSIZE)%MAXSIZE;
4     return length;
5 }

(3)判斷順序隊列是否為空:

1 //判斷隊列是否為空 
2 bool QueueEmpty(sQqueue *q){
3     return(q->front==q->rear);
4 }

(4)順序隊列的插入:

 1 //順序隊列的插入 
 2 bool QueueInsert(sQqueue *q,int num){
 3     if(q->rear==MAXSIZE){
 4         printf("對滿,插入失敗!");
 5         return false;
 6     }
 7     q->data[q->rear]=num;
 8     q->rear++;
 9     return true;
10 }

(5)順序隊列的出隊:

 1 //順序隊列的出隊 
 2 bool QueueDelete(sQqueue *q,int *num){
 3     if(q->front==q->rear){
 4         printf("下溢,出隊失敗!");
 5         return false;
 6     }
 7     *num=q->data[q->front];
 8     q->front++;
 9     return true;
10 } 

(6)順序隊列的遍歷:

 1 //遍歷順序隊列 
 2 void DispQueue(sQqueue *q){
 3     int i;
 4     i=q->front;
 5     while(i!=q->rear){
 6         printf("%d ",q->data[i]);
 7         i=(i+1)%MAXSIZE;
 8     }
 9     printf("\n");
10 }

整體代碼:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 #define null 0
 5 #define MAXSIZE 100
 6 typedef struct node{
 7     int front;
 8     int rear;
 9     int data[MAXSIZE];
10 }sQqueue;
11 //順序隊列的初始化 
12 void InitQueue(sQqueue *q){
13     q->front=0;
14     q->rear=0;
15 }
16 //求順序隊列的長度 
17 int QueueLength(sQqueue *q){
18     int length=(q->rear-q->front+MAXSIZE)%MAXSIZE;
19     return length;
20 }
21 //判斷隊列是否為空 
22 bool QueueEmpty(sQqueue *q){
23     return(q->front==q->rear);
24 }
25 //順序隊列的插入 
26 bool QueueInsert(sQqueue *q,int num){
27     if(q->rear==MAXSIZE){
28         printf("對滿,插入失敗!");
29         return false;
30     }
31     q->data[q->rear]=num;
32     q->rear++;
33     return true;
34 }
35 //順序隊列的出隊 
36 bool QueueDelete(sQqueue *q,int *num){
37     if(q->front==q->rear){
38         printf("下溢,出隊失敗!");
39         return false;
40     }
41     *num=q->data[q->front];
42     q->front++;
43     return true;
44 } 
45 //遍歷順序隊列 
46 void DispQueue(sQqueue *q){
47     int i;
48     i=q->front;
49     while(i!=q->rear){
50         printf("%d ",q->data[i]);
51         i=(i+1)%MAXSIZE;
52     }
53     printf("\n");
54 }
55 int main(){
56     sQqueue *q;
57     int num;
58     q=(sQqueue *)malloc(sizeof(sQqueue));
59     InitQueue(q);
60     printf("順序隊列的基本操作:\n");
61     printf("(1)判斷書序隊列是否為空:");
62     if(QueueEmpty(q))printf("順序隊列為空\n"); 
63     printf("(2)順序隊列入隊:"); 
64     if(QueueInsert(q,1))printf("1插入成功! ");
65     if(QueueInsert(q,2))printf("2插入成功! ");
66     if(QueueInsert(q,3))printf("3插入成功! ");
67     if(QueueInsert(q,4))printf("4插入成功! ");
68     if(QueueInsert(q,5))printf("5插入成功! \n");
69     printf("(3)遍歷順序隊列:");
70     DispQueue(q);
71     printf("(4)順序隊列出隊:");
72     if(QueueDelete(q,&num))printf("%d出隊成功!",num);
73     if(QueueDelete(q,&num))printf("%d出隊成功!",num);
74     if(QueueDelete(q,&num))printf("%d出隊成功!\n",num);
75     printf("     遍歷得順序隊列:");
76     DispQueue(q);
77     printf("(5)順序隊列的長度為:");
78     num=QueueLength(q);
79     printf("%d\n",num);
80 }
順序隊列

運行結果:

 

三、循環隊列

順序隊列經過一段時間的插入和刪除操作,整個隊列的rear指針不斷往后移,最后rear=MAXSIZE,不能再插入數據,而front前面即使由於隊列元素出隊還有很多空間,也不能利用。即“假溢出現象”,假溢出並非出錯狀態,而是不能使空間充分利用。

基本操作如下:

(1)初始化循環隊列

1 //初始化循環隊列 
2 void InitQueue(sqQueue *q){
3     q->front=0;
4     q->rear=0;
5     q->data[0]=0;
6 }

(2)求循環隊列的長度及判斷為滿

1 //求循環隊列的長度 
2 int Queuelength(sqQueue *q){
3     return(q->rear-q->front+MAXSIZE)%MAXSIZE;
4 }
5 //判斷循環隊列是否已滿 
6 bool Isfull(sqQueue *q){
7     return((q->rear+1)%MAXSIZE==q->front);
8 }

(3)循環隊列的入隊

1 //循環隊列的入隊 
2 bool pushQueue(sqQueue *q,int num){
3     if(Isfull(q))return false;
4     q->data[q->rear]=num;
5     q->rear=(q->rear+1)%MAXSIZE;
6     return true;
7 }

(4)循環隊列的出隊

1 //循環隊列的出隊 
2 bool popQueue(sqQueue *q,int *num){
3     if(q->front==q->rear)return false;
4     *num=q->data[q->front];
5     q->front=(q->front+1)%MAXSIZE;
6     return true;
7 } 

(5)循環隊列的遍歷

1 //循環列表的遍歷 
2 void DispQueue(sqQueue *q){
3     int i=q->front;
4     while(i!=q->rear){
5         printf("%d ",q->data[i]);
6         i++;
7     }
8     printf("\n");
9 }

整體代碼:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 #define null 0
 5 #define MAXSIZE 100
 6 typedef struct{
 7     int data[MAXSIZE];
 8     int front;
 9     int rear;
10 }sqQueue;
11 //初始化循環隊列 
12 void InitQueue(sqQueue *q){
13     q->front=0;
14     q->rear=0;
15     q->data[0]=0;
16 }
17 //求循環隊列的長度 
18 int Queuelength(sqQueue *q){
19     return(q->rear-q->front+MAXSIZE)%MAXSIZE;
20 }
21 //判斷循環隊列是否已滿 
22 bool Isfull(sqQueue *q){
23     return((q->rear+1)%MAXSIZE==q->front);
24 }
25 //循環隊列的入隊 
26 bool pushQueue(sqQueue *q,int num){
27     if(Isfull(q))return false;
28     q->data[q->rear]=num;
29     q->rear=(q->rear+1)%MAXSIZE;
30     return true;
31 }
32 //循環隊列的出隊 
33 bool popQueue(sqQueue *q,int *num){
34     if(q->front==q->rear)return false;
35     *num=q->data[q->front];
36     q->front=(q->front+1)%MAXSIZE;
37     return true;
38 } 
39 //循環列表的遍歷 
40 void DispQueue(sqQueue *q){
41     int i=q->front;
42     while(i!=q->rear){
43         printf("%d ",q->data[i]);
44         i++;
45     }
46     printf("\n");
47 }
48 int main(){
49     sqQueue *q;
50     int num;
51     q=(sqQueue *)malloc(sizeof(sqQueue));
52     InitQueue(q);
53     printf("循環隊列的基本操作:\n");
54     printf("(1)初始化循環隊列並入隊\n");
55     pushQueue(q,1);
56     pushQueue(q,2);
57     pushQueue(q,3);
58     pushQueue(q,4);
59     pushQueue(q,5);
60     pushQueue(q,6);
61     printf("(2)循環隊列的遍歷:");
62     DispQueue(q);
63     printf("(3)循環隊列的出隊:");
64     popQueue(q,&num);
65     printf("出隊%d ",num);
66     popQueue(q,&num);
67     printf("出隊%d\n",num); 
68     printf("     遍歷隊列:");
69     DispQueue(q); 
70 }
循環隊列

運行結果:

 

如有錯誤,歡迎指正交流(qq:2991337561)!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM