数据结构和算法学习(4)-栈和队列

原则

栈只允许访问一个数据项,即最后插入的数据项。日出这个数据项后才能访问到数第二个数据项。即后进先出原则。

理解

理解了后进先出原则学习起来就容易多了,就好像是类似汉诺塔,最先放下去的模块只有等待其他模块都被取走之后才能取出;而最后放上去的模块则必须第一个被取走。

用处

栈这种数据结构可以用来操作实现类似字符串的逆序输出、分隔符的匹配等

效率

数据项的出栈入栈时间复杂度都为O(1)。栈操作所耗的时间不依赖于栈中数据项的个数,因此操作时间很短,不需要比较和移动操作

队列

原则

队列也就是排队,不同于栈的原则,第一个进入队列的数据将会第一个被访问,也就是先进先出原则(FIFO)

队列是一种特殊的线性表,它只允许在表头进行删除操作,在队尾进行添加操作

理解

队列的概念非常容易理解,比如在电影院中排队,第一个排队的人总是会第一个进入售票窗口购票

思考

顺序队列

目前所考虑的均是基于顺序队列,当基于数组等固定大小的数据结构所实现的队列时,由于取数据和加数据时队头和队尾下标均要+1,而数据不进行移动,所以会造成已删除数据的数据位为空但无法向其中写入数据,当队尾下标达到可容纳的最大数据量-1时会产生溢出。

细致分析可以分为如下几种情况:

(1)"下溢"现象:当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。
(2)"真上溢"现象:当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。
(3)"假上溢"现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。

循环队列

循环队列是为了解决如上问题而产生的

为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦队头指针增1或队尾指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置

这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列

在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件时front=rear,而队列判满的条件时front=(rear+1)%MaxSize。

双端队列

双端队列就是两端都是队尾的队列,即两端都可以进行增加删除的操作

用途多,但应用较少

优先级队列

优先级队列是一种比栈和队列更为专用的数据结构;同普通队列一样,优先级队列有一个队头有一个队尾,而且同样是从队头移除数据。然而在优先级队列中,数据项按照关键字的值有序排列。这样就保证了关键字最小(或最大)的数据项总是在对头。

数据项插入的时候会按照顺序插入到合适的位置以保证队列的顺序

效率

顺序队列和栈一样,插入数据项和移除数据项的时间复杂度均为

O(1)(顺序队列)

由于优先级队列需要进行比对,比对次数为队列所有数据项个数,故时间复杂度为

O(N)(优先级队列插入)

O(1)(优先级队列删除)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值