第五章 栈和队列

来源:互联网 发布: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;

三、栈的应用

  1. 数据反转:考虑到栈的特点,后进先出。构造栈的过程完成了数据顺序的颠倒过程。
  2. 括号匹配问题:在扫描正文中,遇到的闭括号与此前最近遇到且未匹配的开括号配对。如果最近的未匹配的与当前闭括号不匹配,那么匹配失败。
  3. 表达式的表示、计算和变换:好复杂啊!
  4. 栈与递归
    递归:在一个定义中引用了被定义的对象本身,被称为递归定义。
    要支持递归的实现,需要一个栈来保存递归函数执行时每层调用的局部信息,留待函数调用返回后继续使用。

四、队列

队列的特点是保证在任何时候可访问/删除元素都是在此前最早进入队列的。队列是先进先出。利用数据的线性表来存储顺序,表示数据存储时间的先后顺序

队列的链表实现

队列要求:先进先出。故对于链表来说,尾端插入,首端删除
单链表:首端删除为O(1);尾端添加为O(n)
改进的单链表(增加尾结点):首端方便删除,末端方便增加,都是O(1)

队列的list实现

较麻烦

队列的应用

  1. 打印机的管理程序:管理者一个缓存打印任务的队列。
  2. 万维网服务器:先来先服务的原则
  3. Windows系统消息队列
  4. 等等

五、迷宫求解和状态空间搜索

好复杂–待解决

六、补充

几种与栈或队列相关的结构

双端队列:python标准库的collections包定义了deque类(双链表技术),提供双端队列。

几个问题的讨论

连续的进行一批内存访问是局部的,操作速度会快很多,因此,尽可能使对计算机内存的使用局部化。顺序表就是典型,应尽量使用。链表的结点在内存中任意分配,因此内存层面就是许多随机单元的跳来跳去。链表灵活性高,但效率会有明显的付出。

本章总结

栈:先进后出;队列:先进先出。与时间线性相关

栈:用单链表实现。 前向增加元素;首端弹出元素。都是O(1)
队列:用尾结点的单链表实现。尾端增加元素,首端弹出元素

原创粉丝点击