《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

表、栈和队列是最简单和最基本的三种数据结构。基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了生命。

本章学习重点:

  • 理解抽象数据类型(ADT)的概念
  • 学习如何对表进行有效的操作
  • 熟悉栈ADT及其在实现递归方面的应用
  • 熟悉队列ADT及其在操作系统和算法设计中的应用

ADT

抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充。

对于每种ADT并不存在什么法则来告诉我们必须要有哪些操作,这是一个设计决策、错误处理和关系重组,一般取决于程序设计者。

表ADT

表可以用数组来实现,查找操作以线性时间执行,插入和删除操作的最坏情况为O(N)。由于插入和删除的低效以及表的大小必须事先已知,所以简单数组一般不用来实现表这种数据结构。

为了避免插入和删除的时间开销,我们需要允许表可以不连续存储,否则表的部分或全部需要整体移动。

程序设计中常常留出一个称之为表头(header)或哑结点(dummy node)的标志结点,它解决了几个棘手的问题:从表头插入元素;删除表头元素;一般删除问题,需要记住被删除元素前面的表元。

三个用例:

  1. 计算一元多项式,对于大部分项都有的稠密多项式可以用数组来实现,反之其运行时间不被接受,这时候可以用链表快速实现之。
  2. 实现基数排序。
  3. 多重表。多名学生随机选多门课(40000名学生和2500门课)用多表实现比二维数组实现高效得多。

栈ADT

栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶,只有栈顶元素是可以访问的。栈有时也称LIFO(后进先出)表。同表一样,栈既可以用数组,也可以用链表来实现。

由于CreateStack在栈的数组实现中需要一个初始化数组长度的参数,而在链表实现中不需要参数,因此后者的实现中不添加哑元的话,那么这个使用栈的例程就需要知道正在使用的是哪种方法。不幸的是,效率和软件理想主义常常发生冲突。

三个应用:

  1. 平衡符号,可以用于编译器检查程序的语法错误。

  算法描述:做一个空栈,读入字符直到文件尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,则当栈空时报错。否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。

  可以看出,算法是线性的且是在线(on-line)的。

  2.  后缀表达式。如操作4.99 * 1.06 + 5.99 + 6.99 * 1.06采用后缀(postfix)或逆波兰(reverse Polish)记法:4.99 1.06 * 5.99 + 6.99 1.06 * +

  算法描述:当见到一个数时就把它推入栈中,遇到一个运算符时就作用于从该栈弹出的两个数上,将所得结果推入栈中。

  时间花费O(N).

  除此之外,我们还可以用栈将一个标准形式(也称中缀式(infix))转换成后缀式。

  3.  函数调用。不多说了,CSAPP比这里详细得多。

队列ADT

像栈一样,队列也是表。然而,使用队列时插入在一端进行而删除则在另一端进行。队列可以用数组实现也可以用链表实现。

三个应用:

  1. 当作业送交给一台行式打印机,它们就按照到达的顺序被排列起来。因此,被送往行式打印机的作业基本上是放在一个队列中。
  2. 这个例子是关于计算机网络的。用许多中PC机的网络设置,其中磁盘是放在一台叫做文件服务器的机器上的。使用其他计算机的用户是按照先到先使用的原则访问文件的,因此其数据结构是一个队列。
  3. 进一步的例子:

a)当所有的接线员忙的不可开交的时候,对大公司的传呼一般都被放在一个队列中。

b)在大规模的大学里,如果所有的终端都被占用,由于资源有限,学生们必须在一个等待表上签字。在终端上呆的时间最长的学生将首先被强制离开,而等待时间最长的学生则将是下一个被允许使用终端的用户。

正如栈一样,队列还有其他丰富的用途,这样一种简单的数据结构竟然能够如此重要,实在令人惊奇。

Summary

  本章描述了一些ADT的概念,并且利用三种最常见的抽象数据类型(ADT)阐述了这个概念。主要目的就是将抽象数据类型的具体实现与它们的功能分开。程序必须知道操作都做些什么,但是如果不知道如何去做实际上更好。

  表、栈和队列或许在全部计算机科学中是三个基本的数据结构,大量的例子证明了它们广泛的用途。特别地。我们看到栈是如何用来记录过程和函数调用的,已经递归实际上是如何实现的。理解这些过程是非常重要的,其原因不只是因为它使得过程语音成为可能,而且还因为知道递归的实现从而消除了围绕其使用的大量谜团。虽然递归非常强大,但是它并不是完全随意的操作;递归的误用和乱用可能导致程序崩溃。

时间: 2024-12-15 06:59:11

《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes的相关文章

《数据结构与算法分析:C语言描述_原书第二版》CH2算法分析_课后习题_部分解答

对于一个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这里尽自己的努力给出部分习题的详解: 不当之处,欢迎指正. 1.  按增长率排列下列函数:N,√2,N1.5,N2,NlogN, NloglogN,Nlog2N,Nlog(N2),2/N,2N,2N/2,37,N2logN,N3.指出哪些函数以相同的增长率增长. 答:排列如下2/N < 37 < √2 < N < NloglogN < NlogN < Nlog(N2) < Nlog2

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

数据结构与算法分析 c语言描述 pdf 高清下载

网盘下载:数据结构与算法分析 c语言描述 pdf 高清下载 – 易分享电子书PDF资源网 作者: [美] Mark Allen Weiss 出版社: 机械工业出版社 副标题: C语言描述 原作名: Data Structures and Algorithm Analysis in C:Second Edition 译者: 冯舜玺 出版年: 2004-1-1 页数: 391 定价: 35.00元 装帧: 平装 内容简介 · · · · · · 本书是<Data Structures and Alg

数据结构与算法分析_Java语言描述(第2版)pdf

下载地址:网盘下载 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计). 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长.本书将算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,并细致讲解精心构造程序的方法,内容全面.缜密严格. 第3版的主要更新如下: ? 第4章包含AVL树删除算法的实现. ? 第5章进行了全面修订和扩充,现在包含两种较

数据结构与算法分析_Java语言描述(第2版)高清版pdf免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑“数据结构”是计算机专业的基础与核心课程之一,Java是现今一种热门的语言.本书在编写过程中特别考虑到了面向对象程序设计(OOP)的思想与Java语言的特性.它不是从基于另一种程序设计语言的数据结构教材简单地“改编”而来的,因此在数据结构的实现上更加“地道”地运用了Java语言,并且自始至终强调以面向对象的方式来思考.分析和解决问题.本书是为数据结构入门课程(通常课号是CS-2)而编写的教材.作者Frank Carrano在编写过程自始至终特别

《数据结构与算法分析Java语言描述》PDF文件免费下载

图书简介: 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计). 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长.本书把算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,内容全面.缜密严格,并细致讲解精心构造程序的方法. 图书目录部分截图: 结语:总结 数据结构与算法分析需要这份PDF文档的朋友,欢迎加Q群:219571750,免费领取,

《数据结构与算法分析 C语言描述》读书笔记——分治算法

书中用求解最大子序列和的方式介绍了分治算法(divide-and-conquer) 分治算法是一种相对快速的算法 运行时间为O(logN) 最大子序列和的问题如下: 给出一组整数 A1  A2 … AN 求∑jk=i Ak 若所有整数均为负 则最大子序列和为0 e.g. 输入-2, 11,-4, 13, -5, -2 输出20(A2到A4) 分治算法就如同字面描述的一样 先分再治 分 指的是将问题分为两部分几乎相同的子问题 进行递归求解 治 指的是将 分 的解通过简单的手段合并 得到最终解 对于

【数据结构与算法分析——C语言描述】练习1.1——选择问题

本部分内容来自http://www.cnblogs.com/mingc,笔者在此只用于整理学习. 问题描述:编写一个程序解决选择问题.令k=N/2.画出表格显示你的程序对于N为不同值时的运行时间. 理解:设有一组N个数确定其中第k个最大者,称选择问题(selection problem) 思路:读入前k个数到临时数组tmp(并按降序排列).然后逐个读取后续数字X,当X大于第k个数时,将其加入数组tmp(并按降序排列).最后返回位置k-1上的值 #include <stdio.h> #inclu

《数据结构与算法分析——C语言描述》ADT实现(NO.01) : 栈(Stack)

这次的数据结构是一种特殊的线性表:栈(Stack) 栈的特点是后入先出(LIFO),可见的只有栈顶的一个元素. 栈在程序中的地位非常重要,其中最重要的应用就是函数的调用.每次函数调用时都会创建该函数的一个“活动记录”( Activation Record ,或称作“帧”( Frame ))压入运行时堆栈中,用于保存函数的参数,返回值,返回指令地址,返回活动记录地址,局部变量等内容.当然,在高级语言中我们不需要手动完成这一工作,学习汇编语言时会体会到其真正过程. 下面给出笔者对于堆栈的两种实现.首