线性结构的两种常见应用之二队列
定义:
一种可以实现“先进先出”的存储结构。
分类:
离散(链式)队列--用链表实现
静态(连续)队列--用数组实现
静态队列通常必须是循环队列
循环队列的必须要弄清除的7个问题:
1.静态队列为什么必须是循环队列
由于连续空间的问题,为了节省空间,方便操作,速度快等优点。
2.循环队列需要几个参数来确定
需要2个参数来确定
3.循环队列各个参数的含义
2个参数不同场合有不同的含义
1).队列初始化
front = rear = 0
2).队列非空
front代表的是队列的第一个元素
rear代表的是队列的最后一个有效元素
3).队列空
front = rear 但不一定为零
4.循环队列入队伪算法讲解
两步完成:
1.将值存入rear所代表的位置
2.错误的写法:rear= rear+ 1;
正确的写法:rear=(rear+ 1)%数组的长度
5.循环队列出队伪算法讲解
front=(front+ 1)%数组的长度
6.如何判断循环队列是否为空
如果front与 rear的值相等,
则该队列就一定为空
7.如何判断循环队列是否已满
预备知识:
front的值可能比rear大,可能比他小,也可能相等
两种方式:
1.多增加一个标识参数
2.不用数组的最后一个元素[通常使用第二种方式]
如果rear和 front的值紧挨着,则队列已满
if((rear+1)%数组长度== front)
已满
else
不满
循环队列程序演示:
- #include <stdio.h>
- #include <stdlib.h>
- #define M 6 //数组长度
- #define bool char //c语言中没有bool类型,自己添加的
- #define true 1
- #define false 0
- typedef struct Queue
- {
- int * pBase;//数组首地址,相当于数组名
- int front;
- int rear;
- }QUEUE;
- void init(QUEUE *);//初始化队列
- bool en_queue(QUEUE *,int);//入队列
- bool out_queue(QUEUE *, int *);//出队列
- void traverse_queue(QUEUE *);//遍历队列
- bool full_queue(QUEUE *);//判断队列是否为满
- bool empty_queue(QUEUE *);//判断队列是否为空
- int main (int argc, const char * argv[])
- {
- QUEUE Q;
- int val;
- init(&Q);
- //测试数据
- en_queue(&Q, 1);
- en_queue(&Q, 2);
- en_queue(&Q, 3);
- en_queue(&Q, 4);
- en_queue(&Q, 5);
- en_queue(&Q, 6);
- en_queue(&Q, 7);
- en_queue(&Q, 8);
- traverse_queue(&Q);
- if (out_queue(&Q, &val))
- {
- printf("出队成功,队列出队元素为:%d\n",val);
- }
- else
- printf("出队失败!");
- traverse_queue(&Q);
- return 0;
- }
- void init(QUEUE *pQ)
- {//初始化队列
- pQ->pBase = (int *)malloc(sizeof(int) * M);
- pQ->front = 0;
- pQ->rear = 0;
- return;
- }
- bool full_queue(QUEUE * pQ)
- {//队列是否为满
- if ((pQ->rear + 1) % M == pQ->front) {
- return true;
- }
- else
- return false;
- }
- bool en_queue(QUEUE * pQ,int val)
- {//入队列
- if (full_queue(pQ)) {
- return false;
- }
- else
- {
- pQ->pBase[pQ->rear] = val;
- pQ->rear = (pQ->rear + 1) % M;
- return true;
- }
- }
- void traverse_queue(QUEUE * pQ)
- {//遍历队列
- int i = pQ->front;
- while(i != pQ->rear)
- {
- printf("%d ",pQ->pBase[i]);
- i = (i+1) % M;
- }
- return;
- }
- bool empty_queue(QUEUE * pQ)
- {//队列是否为空
- if (pQ->front == pQ->rear) {
- return true;
- }
- else
- return false;
- }
- bool out_queue(QUEUE * pQ, int * pVal)
- {//出队列
- if (empty_queue(pQ)) {
- return false;
- }
- else
- {
- *pVal = pQ->pBase[pQ->front];
- pQ->front = (pQ->front + 1) % M;
- return true;
- }
- }