第五章 栈和队列
来源:互联网 发布:python 字典添加 编辑:程序博客网 时间:2024/06/08 02:33
第五章 栈和队列
回顾:容器的概念。线性表就是第一种容器。本章介绍另外两类最常用的容器,分别为栈(stack)和队列(queue)
一、概述:
栈和队列主要用于计算机过程中存储临时数据。当临时数据项数不能完全确定时,必须采用更复杂的存储机制和管理—-缓冲存储或缓存。栈和队列就是使用最多的缓冲存储结构。
栈、队列和数据使用顺序
栈和队列只支持数据项的存储和访问,不支持数据项之间的任何关系。集合很小,简单。最重要的是存入元素和取出元素的两个操作
栈是保证数据后进先出;队列是保证元素先进先出。
从实现的角度看,考虑最简单而且自然的技术,由于计算机存储器的特点,要实现栈或队列,最自然的技术就是用元素存储的顺序表示时间顺序,应该用线性表来作为栈和队列的实现结构。
Python的基本功能中已经包含了对栈的支持,可以用list实现栈的功能;Python的标准库还提供了一种支持队列用途的结构deque
二、栈
存入栈的元素之间没有任何具体关系,只有到来的时间先后顺序。这种基本性质能保证,在任何时刻可以访问、删除的元素都是在此之前最后存入的那个元素。因此,栈确定了一种默认元素访问顺序。
栈抽象数据类型
对于顺序表,后端插入和删除操作是O(1)操作,应该用这一端作为栈顶(采用顺序表实现,用表尾作栈顶)
对于链接表,前端插入和删除操作是O(1)操作,应该用head端来做为栈顶。
实例一、栈的顺序表实现
Python的list及其操作实际上提供了与栈的使用方式有关的功能,可以直接作为栈来使用。list线性表,顺序表,末端作为栈的前端,其他一些方法和list对应。
实例二、栈的链表实现
添加元素操作就是====链表的前向添加操作 self.top=LNode(elem,self.top)
删除元素 p=self.top; self.top=p.next; return p.elem;
三、栈的应用
- 数据反转:考虑到栈的特点,后进先出。构造栈的过程完成了数据顺序的颠倒过程。
- 括号匹配问题:在扫描正文中,遇到的闭括号与此前最近遇到且未匹配的开括号配对。如果最近的未匹配的与当前闭括号不匹配,那么匹配失败。
- 表达式的表示、计算和变换:好复杂啊!
- 栈与递归
递归:在一个定义中引用了被定义的对象本身,被称为递归定义。
要支持递归的实现,需要一个栈来保存递归函数执行时每层调用的局部信息,留待函数调用返回后继续使用。
四、队列
队列的特点是保证在任何时候可访问/删除元素都是在此前最早进入队列的。队列是先进先出。利用数据的线性表来存储顺序,表示数据存储时间的先后顺序
队列的链表实现
队列要求:先进先出。故对于链表来说,尾端插入,首端删除
单链表:首端删除为O(1);尾端添加为O(n)
改进的单链表(增加尾结点):首端方便删除,末端方便增加,都是O(1)
队列的list实现
较麻烦
队列的应用
- 打印机的管理程序:管理者一个缓存打印任务的队列。
- 万维网服务器:先来先服务的原则
- Windows系统消息队列
- 等等
五、迷宫求解和状态空间搜索
好复杂–待解决
六、补充
几种与栈或队列相关的结构
双端队列:python标准库的collections包定义了deque类(双链表技术),提供双端队列。
几个问题的讨论
连续的进行一批内存访问是局部的,操作速度会快很多,因此,尽可能使对计算机内存的使用局部化。顺序表就是典型,应尽量使用。链表的结点在内存中任意分配,因此内存层面就是许多随机单元的跳来跳去。链表灵活性高,但效率会有明显的付出。
本章总结
栈:先进后出;队列:先进先出。与时间线性相关
栈:用单链表实现。 前向增加元素;首端弹出元素。都是O(1)
队列:用尾结点的单链表实现。尾端增加元素,首端弹出元素
- 第五章 栈和队列
- 第五章 队列
- 第五章(队列)
- 数据结构与算法C#语言描述第五章栈和队列
- 数据结构与算法C#语言描述第五章栈和队列
- 剑指offer第五题(栈和队列)
- 第五章Linux消息队列
- 栈和队列--队列
- 【栈和队列】队列
- UNPv2第五章:Posix消息队列
- 第三章:栈和队列
- 第三章 栈和队列
- 第三章:栈和队列
- 第三章栈和队列
- 第三章 栈和队列
- 第三章 栈和队列
- 第三章:栈和队列
- 第三章 栈和队列
- Hive元数据在MySQL的存储逻辑及关系
- js选择器
- 高数 01.08函数的连续性与间断点
- PCB元件布局原则与实用小技巧
- 集成 Jenkins 和 TestNG 实现自助式自动化测试平台
- 第五章 栈和队列
- MVP模式在Android开发中的应用
- python __new__方法
- SVN检测的项目报错---解决办法
- ofo产品体验&共享单车精细化运营的思考
- win10下通过wubi.exe安装ubuntu
- 关于UILongPressGestureRecognizer调用多次的问题
- 程序运行时间
- 虚函数(C++)