数据结构基础
第三章:队列
文章目录
一、队列介绍
队列是一种(fifo)先进先出的数据结构,我们可以形象地把队列比喻成食堂打饭的队伍,其中排队的学生就是一个个数据元素,当同学们以此入队打饭,打完饭后从队头出去。如图所示:
提示:以下是本篇文章正文内容,下面案例可供参考
二、队列的抽象数据类型
我们先用数组进行队列的定义:
typedef struct queue
{
int *arr;
int maxsize;
int front;//头
int rear;//尾
}Queue;
队列假溢出问题
不难看出当front=rear时,队列为空,但当元素装满队列并全部出队后,此时的队列会出现假满假溢出的状态,因此数字实现的普通的队列无法满足我们的需求,所以我们推出循环队列,如图所示:
这边判断空和判断满的表达式就不一样啦
而这里我们的条件为:
(rear+1)%maxsize=front;//这个为判满
rear=front;//这个为判空
这样我们就完美解决了普通队列假溢出的问题,但是朋友们看图会发现front为何指向一个不使用的空间,这是为了使循环队列的判满判空条件不一样。
三、队列的主要运算
1、创建队列
void Creat(Queue *q,int max)
{
q->maxsize=max;
q->arr=new int[max];
q->front=q->rear=0;
}
2、队列的入队和出队
bool EnQueue(Queue *q,int x)
{
if(Isfull(q))
return false;
q->rear=(q->rear+1)%q->maxsize;
q->arr[q->rear]=x;
return true;
}
//分界线
bool DeQueue(Queue *q)
{
if(Isempty(q))
return true;
q->front=(q->front+1)%q->maxsize;
return true;
}
总结
本文简单形象地介绍了队列的顺序实现,其中解决假溢出的问题很重要,队列的链接实现与上一章堆栈链接实习差不多,希望自己探究摸索!!今天的分享就到这啦!