队列 —— 循环队列

循环对列的存储结构定义:

1 #include<stdio.h>
2 #include<stdlib.h>
3 #define M 5
4 typedef int QueueElementType;
5 typedef struct{
6     QueueElementType element[M];/*队列的元素空间,用数组实现*/
7     int front;/*头指针指示器*/
8     int rear;/*尾指针指示器*/
9 }SeqQueue;

循环对列初始化:

1 SeqQueue* InitQueue(){
2     /*malloc动态分配空间*/
3     SeqQueue* q = (SeqQueue*)malloc(sizeof(SeqQueue));
4     /*初始化一个空的循环队列*/
5     q->front = q->rear = 0;
6     return q;
7 }

循环对列入队:

 1 int enterQueue(SeqQueue* q, QueueElementType x) {
 2 /*元素x进入循环队列,需要判断循环队列是否已满*/
 3     if ((q->rear+1)%M==q->front)
 4     {
 5         return false;
 6     }
 7     /*元素x从尾部进入循环队列*/
 8     q->element[q->rear] = x;
 9     /*循环队列的尾指针向后移动1位,(q->rear+1)%M:实现循环作用*/
10     q->rear = (q->rear + 1) % M;
11     return true;
12 }

循环对列出队:

1 int deleteQueue(SeqQueue* q, QueueElementType* x) {
2     /*循环队列出队操作,需要判断循环队列是否为空*/
3     if (q->front==q->rear) {
4         return false;
5     }
6     *x = q->element[q->front];
7     q->front = (q->front + 1) % M;
8     return true;
9 }

循环对列长度:

1 int length(SeqQueue *q) {
2     return (q->rear - q->front + M) % M;
3 }

循环对列的打印:

1 void printfQueue(SeqQueue* q) {
2     printf("循环队列的元素:");
3     for (int i = q->front; i <q->rear; i++)
4     {
5         printf("%d ", q->element[i]);
6     }
7     printf("\n");
8 }

主函数:

 1 int main() {
 2     SeqQueue* q = initQueue();
 3     QueueElementType x;
 4 
 5     enterQueue(q, 10);
 6     enterQueue(q, 20);
 7     enterQueue(q, 30);
 8     enterQueue(q, 40);
 9     printfQueue(q);
10 
11     /*循环队列的长度*/
12     int l = length(q);
13     printf("循环队列的长度:%d\n", l);
14 
15     deleteQueue(q, &x);
16     printf("循环队列出队的元素:%d\n", x);
17     deleteQueue(q, &x);
18     printf("循环队列出队的元素:%d\n", x);
19     deleteQueue(q, &x);
20     printf("循环队列出队的元素:%d\n", x);
21     deleteQueue(q, &x);
22     printf("循环队列出队的元素:%d\n", x);
23 
24     printfQueue(q);
25     return 0;
26 }

posted @ 2020-11-16 21:25  笺笙  阅读(192)  评论(0编辑  收藏  举报