ch3-栈和队列-循环队列的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//实现循环队列
#include <stdio.h>
#define maxsize 5
int enQueue(int *a,int front,int rear,int data){
if((rear+1)%maxsize==front){
printf("空间已满,sorry");
return rear;
}
//若当前队列未满,则执行入队操作
printf("入队元素:%d\n",data);
a[rear%maxsize]=data;//若rear超过了maxsize,则直接将其从a[0]开始存储
//上面这句可以这样子理解:
//当raer<maxsize时,说明rear未超过maxsize,此时按照普通顺序执行(rear%maxsize==rear)
//而当raer>=maxsize时,说明raer超过了maxisize(能且只能超出1,所以取等号更准确,比如maxisize为5,rear指向4,则下一次rear变为5,5%5==0,于是rear从a[0]处开始存储)
rear++;
return rear;//入队涉及头指针rear,故返回rear
}

int deQueue(int *a,int front,int rear){
//循环队列队空条件:rear==front
if(rear==front){
printf("队列为空");
return front;
}
printf("出队元素,%d\n",a[front]);
front=(front+1)%maxsize;//front不再直接 +1,而是+1后同max进行比较,如果=max,则直接跳转到 a[0]
return front;//出队涉及头指针front,故返回front
}

int main(){
int a[maxsize];
int front,rear;
//设置队头指针和队尾指针,当队列中没有元素时,队头和队尾指向同一块地址
rear=front=0;
//开始入队
rear=enQueue(a,front,rear,1);
rear=enQueue(a,front,rear,2);
rear=enQueue(a,front,rear,3);
rear=enQueue(a,front,rear,4);
//出队
front=deQueue(a,front,rear);
//再入队
rear=enQueue(a,front,rear, 5);
//再出队
front=deQueue(a, front, rear);
//再入队
rear=enQueue(a,front,rear, 6);
//再出队
front=deQueue(a, front, rear);
front=deQueue(a, front, rear);
front=deQueue(a, front, rear);
front=deQueue(a, front, rear);
return 0;
}

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
入队元素:1
入队元素:2
入队元素:3
入队元素:4
出队元素,1
入队元素:5
出队元素,2
入队元素:6
出队元素,3
出队元素,4
出队元素,5
出队元素,6

凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条