线性结构的两种常见应用之二 队列
定义
- 一种可以实现“先进先出”的内存结构
分类
- 链式队列 --用链表实现
- 静态队列 --用数组实现,静态队列通常都必须是循环队列
循环队列的的讲解
1.静态队列为什么必须是循环队列
2.循坏队列需要几个参数来确定
需要两个参数来确定:front/rear
3.循环队列各个参数的含义
两个参数不同场合有不同的含义
- 建议初学者先记住,然后慢慢体会
(1) 队列初始化:front/rear的值都是零
(2)队列非空:front代表的是队列的第一个元素,rear代表的是队列的最后一个有效元素的下一个元素。
(3)队列空:front/rear的值相等,但不一定是零
4.循环队列入队伪算法讲解
(1)将值存入rear所代表的位置
(2)错误的写法:rear = rear + 1;正确的写法:rear = (rear + 1)%数组的长度
5.循环队列出队伪算法讲解
- front = (front + 1)%数组的长度
6.如何判断循环队列是否为空
- 如果front与rear的值相等,则该队列就一定为空
7.如何判断循环队列是否已满
(0)预备知识:front的值可能比rear大,front的值也可能比rear小,当然也可能两者相等。
(1)多增加一个标志位参数(记录队列长度)
(2)少用一个元素
//如果r和f的值紧挨着,则队列已满(C语言伪算法)
if( (r+1)%数组长度 == f )
已满
else
不满
队列算法
- 入队
- 出队
队列的具体应用
- 所有和时间有关的操作都与队列的影子
代码
//循环队列.cpp
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Queue
{
int * pBase;
int front;
int rear;
}QUEUE;
//函数声明
void init(QUEUE *);
bool en_queue(QUEUE *, int val);
void traverse_queue(QUEUE *);
bool full_queue(QUEUE *);
bool out_queue(QUEUE *, int *);
bool empty_queue(QUEUE *);
int main(void)
{
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("出队失败!");
}
system("pause");
return 0;
}
void init(QUEUE *pQ)
{
pQ->pBase = (int*)malloc(sizeof(int) * 6);
pQ->front = 0;
pQ->rear = 0;
}
bool full_queue(QUEUE * pQ)
{
if( (pQ->rear + 1) % 6 == 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) % 6;
return true;
}
}
void traverse_queue(QUEUE * pQ)
{
int i = pQ->front;
while(i != pQ->rear)
{
printf("%d ", pQ->pBase[i] );
i = (i + 1) % 6;
}
printf("\n");
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) % 6;
return true;
}
}
本文来自博客园,作者:小恒2020,转载请注明原文链接:https://www.cnblogs.com/xiaoheng2020/p/12679823.html