## 队列的具体应用:
所有和事件有关的操作都有队列的影子。
(例如操作系统认为先进来的先处理)
## 定义:
一种可是实现“先进先出”的存储结构
## 分类:
链式队列:用链表实现
![](https://box.kancloud.cn/2016-04-20_57172835218e3.jpg)
静态队列:用数组实现
静态队列通常都必须是循环队列,为了减少内存浪费。
![](https://box.kancloud.cn/2016-04-20_5717283532751.jpg)
## 循环队列 :
### 1、静态队列为什么必须是循环队列
如果用传统意义的数组实现队列,无论入队还是出队,rear和front指针只能+不能-;
比 F元素下标小的的数组元素下标就浪费了。
###循环队列怎么用呢?
![](https://box.kancloud.cn/2016-04-20_5717283544e04.jpg)
当出现这种情况时,如果仍然需要插入元素,那么f指向下一个位置,即5,r指向下一个位置即0.如图:
![](https://box.kancloud.cn/2016-04-20_571728355c5ec.jpg)
那么,我们在插入一个元素“国”,然后再删除中呢?
![](https://box.kancloud.cn/2016-04-20_571728356f03b.jpg)
这就是所谓的循环队列。
### 2、 循环队列需要几个参数来确定 及其含义
需要2个参数来确定
front
rear
### 3、 循环队列各个参数的含义
2个参数不同场合不同的含义?
建议初学者先记住,然后慢慢体会
1)队列初始化
front和rear的值都是零,初始化时队列就是空的。
2)队列非空
front代表队列的第一个元素
rear代表了最后一个有效元素的下一个元素
3)队列空
front和rear的值相等,但是不一定是零
### 4、循环队列入队伪算法讲解
需要判断r是否指向数组最后一个元素。
两步完成:
1)将值存入r所代表的位置
2)将r后移,正确写法是rear = (rear+1)%数组长度
错误写法:rear=rear+1;
### 5、 循环队列出队伪算法讲解
front = (front+1)% 数组长度
### 6、 如何判断循环队列是否为空
如果front与rear的值相等,
则队列一定为空
### 7、 如何判断循环队列是否已满
![](https://box.kancloud.cn/2016-04-20_5717283583260.jpg)
上图这种情况,如果再插入f,r指向同一个元素。如果这样的话就不能判断队列是空还是满。
所以为了判断循环队列是否已满,有一下两种方式:
1、多增加一个表标识的参数
2、少用一个队列中的元素(才一个,不影响的)
如果r和f紧挨着(r的下一个位置是f),则队列已满
用C语言描述:
If((r+1)%数组长度)==f
队列已满
Else
队列不满