《数据结构算法与应用-C++语言描述(五)》青少年教育丛书.pdfVIP

  • 1
  • 0
  • 约4.89万字
  • 约 28页
  • 2017-10-29 发布于浙江
  • 举报

《数据结构算法与应用-C++语言描述(五)》青少年教育丛书.pdf

下载 第5章 堆 栈 堆栈和队列可能是使用频率最高的数据结构,二者都来自于第 3章中的线性表数据结构 (经过某种限制以后)。本章将研究堆栈,下一章研究队列。堆栈数据结构是通过对线性表的插 入和删除操作进行限制而得到的(插入和删除操作都必须在表的同一端完成),因此,堆栈是 一个后进先出(last-in-first-out, LIFO )的数据结构。 由于堆栈是一种特殊的线性表,因此可以很自然地从相应的线性表类中派生出堆栈类。我 们可以从程序3 - 1 的L i n e a r L i s t类派生出基于公式描述的堆栈类,也可以从程序 3 - 8 的C h a i n类派 生出基于链表结构的堆栈类。通过类的派生,可以大大简化程序设计的任务,但同时代码的执 行效率有明显损失。由于堆栈是一个很基本的数据结构,许多程序都要用到堆栈,本章中也直 接给出了基于公式描述和基于链表结构的堆栈类(而不是从其他类派生而来)。这两种类与对 应的派生类相比,在执行效率上将有很大提高。 本章还给出六个使用堆栈的应用程序。第一个应用是一个用来匹配表达式中左、右括号的 简单程序;第二个应用是一个经典的汉诺塔问题求解程序。汉诺塔问题要求把一个塔上的所有 碟子按照一定的规则搬到另一个塔上,每次只能搬动一个碟子,其间可以借助于第 3个塔的帮 助。在汉诺塔问题的求解过程中,每个塔都被视为一个堆栈;第三个应用使用堆栈来解决火车 车厢重排问题,其目标是把火车车厢按所希望的次序重新排列;第四个应用是关于电子布线的 问题,在这个应用中,用堆栈来确定一个电路是否可以成功布线;第五个应用用于解决 3 . 8 . 3节 所介绍的离线等价类问题。采用堆栈可以帮助我们在线性时间内确定等价类;最后一个应用用 来解决经典的迷宫问题,即寻找一条从入口到出口的迷宫路径。应该仔细地研究这个应用,因 为它体现了许多软件工程的原理和思想。 本章中所用到的C + +语言的新的特性是派生类和继承。 5.1 抽象数据类型 定义 [堆栈] 堆栈(s t a c k )是一个线性表,其插入(也称为添加)和删除操作都在表的同一端 进行。其中一端被称为栈顶(t o p ),另一端被称为栈底(b o t t o m )。 图5-1a 给出了一个四元素的堆栈。假定希望在 5-1a 的堆栈中添加一个元素E ,这个元素将 被放到元素D 的顶部,所得到的结果如图5-1b 所示。如果想从5-1b 的堆栈中删除一个元素,那 么元素E将被删除,删除E之后又将得到5-1a 的结果。如果对5-1b 的堆栈连续执行三次删除操 作,则将得到图5-1c 所示的堆栈。 E ← t o p D ←t o p D C C B B B ←t o p A ←b o t t o m A ←b o t t o m A ←b o t t o m a ) b ) c ) 图5-1 堆栈结构 1 6 2 第二部分 数 据 结 构 下载 从上面的讨论中可以看出,堆栈是一个后进先出表。这种类型的表在计算过程中将频繁使 用。A D T堆栈的描述见ADT 5-1 。 ADT5-1 堆栈的抽象数据类型描述 抽象数据类型S t a c k { 实例 元素线性表,栈底,栈顶 操作 C re a t e( ) :创建一个空的堆栈 I s E m p t y ( ) :如果堆栈为空,则返回t r u e ,否则返回

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档