数据结构 学习笔记 队列

队列

基础概念:限定只能在一端插入、另一端删除的线性表。

一些定义:

允许删除的一端叫做队首(front)

允许插入的一端叫做队尾(rear)

插入称作入队,删除称为出队

队列是先进先出(FIFO)

 

储存方式:

方式一、顺序存储(数组+双指针)

讨论1:1.为什么使用双指针而非直接将data[0]设置为队头,仅使用一个队尾指针rear?

答:如果仅使用一个队尾指针,的确可以简化入队运算,不需移动元素,只需将元素插入队尾即可。但出队操作时,每次都要删除data[0]的元素,即移动后续元素,同时还需修改rear指针。

讨论2:关于front和rear指针,有多种处理方法,一种是front指向头元素的前一个元素,而非指在头元素上。rear指向队尾。而另一种处理方法则是front指向头元素,rear指向队尾后一个元素,为什么要这样处理?

答:对于普通顺序队列用处不大,但对于循环队列而言可以省去很多麻烦,后续采用第一种处理方式。

 

普通顺序队列存在的问题:

可能会由于不断的入队和出队导致“假溢出”,即rear指针已经到达队尾而front由于不断出队导致不断后移,致使数组元素其实未满但由于rear到达MAXLEN-1后提示队满。

 

循环队列

即data[0]紧挨着data[MAXLEN-1]首尾相接成环

即当rear == MAXLEN - 1之后,rear再次++后让rear = 0,这样即形成了一个逻辑上的闭环(而非物理上的)。data数组中由于这样的操作,可能会出现front > rear的情况。

而如何进行这样的运算呢?

方法一、手工判断

rear = (rear + 1 == MAXLEN) ? 0 : rear++;

方法二、取模

rear = (rear + 1) % MAXLEN

 

出队也是同样的

front = (front + 1) % MAXLEN

但是紧接着的问题是如何判断队满或者队空?

不能仅以front == rear 判断,因为这样无法具体判断是队空还是队满。

解决该问题有如下两种方案:

方案一、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值