引入
前面我们讲了,如何初始化一个循环队列,今天我们就来讲讲如何在队列中插入和删除数据。
入队列操作
如何判断队列已经满了
0 | 1 | 2 | 3 | 4 | front | rear | 新 rear : (rear+1)%MAXSIZE |
---|---|---|---|---|---|---|---|
a | 0:a | 1: | (1+1)%5=2 | ||||
a | b | 0:a | 2: | (2+1)%5=3 | |||
a | b | c | 0:a | 3: | (3+1)%5=4 | ||
b | c | d | 1:b | 4: | (4+1)%5=0 | ||
c | d | e | 2:c | 0: | (0+1)%5=1 | ||
f | c | d | e | 2:c | 1 | (1+1)%5=2 | |
f | g | c | d | e | 2:c | 2 | front=rear 所以满栈了 |
利用取模这个思路判断满栈就是
- 就是让尾指针从头到尾不断的移动
- 利用取模,让尾指针不断的在0~4之间移动
- 如果尾指针指向了头部,也就是说
- 可以插入的位置等于队列的第一个结点的位置了
- 那就证明满栈了
1 | void InsertQueue(struct Queue *q , int e){ |
代码思路
- 队头是当前排第一个的结点位置
- 队尾是当前可插入的结点位置
出队操作
1 | void delete_queue(struct Queue *q){ |
计算队列长度
1 | int queue_length(struct Queue*q){ |
全部代码
1 |
|
输出
目前长度是1
目前长度是2
目前长度是3
目前长度是4
目前长度是4
0号是:1
1号是:2
2号是:3
3号是:4
困惑
老实说,我也没搞明白,MAXSIZE 是5,最后一个结点因为 insert 的判断,竟然没有能够赋值。我明明输入了5个数进去,却只返回了4个数。
但书上《数据结构(C语言版)》确实是这么写的…
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。