数据结构和算法学习(4)-栈和队列
2015-09-29 14:08
411 查看
栈
原则
栈只允许访问一个数据项,即最后插入的数据项。日出这个数据项后才能访问到数第二个数据项。即后进先出原则。理解
理解了后进先出原则学习起来就容易多了,就好像是类似汉诺塔,最先放下去的模块只有等待其他模块都被取走之后才能取出;而最后放上去的模块则必须第一个被取走。用处
栈这种数据结构可以用来操作实现类似字符串的逆序输出、分隔符的匹配等效率
数据项的出栈入栈时间复杂度都为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)(优先级队列删除)
相关文章推荐
- 实验报告--数据结构实验一
- 【ShancoLove】带你看数据结构——第一课:概论
- Linux内核中的常用数据结构-双向链表(1)
- 基本数据结构(2)——算法导论(12)
- 关于数据结构中栈的若干使用
- B树,B-树,B+树,B*树
- 数据结构之线性表-链式存储之循环链表(三)
- 数据结构之线性表-链式存储之静态链表(二)
- 基础数据结构--队列链表实现
- 数据结构学习笔记
- 基础数据结构--栈实现
- 数据结构-最大子序列号
- 数据结构与算法分析(c++版) #12 二叉树
- 堆的基本实现
- 重学数据结构-树
- 数据结构和算法学习(3)-简单排序
- 数据结构_二叉索引树_模板
- 数据结构和算法学习(2)-时间复杂度
- 数据结构和算法学习(1)-概述
- Scala2.11.7学习笔记(四)常用数据结构