《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表、栈和队列是最简单和最基本的三种数据结构。基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明。
本章学习重点:
- 理解抽象数据类型(ADT)的概念学习如何对表进行有效的操作
- 熟悉栈ADT及其在实现递归方面的应用
- 熟悉队列ADT及其在操作系统和算法设计中的应用
ADT
抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充。对于每种ADT并不存在什么法则来告诉我们必须要有哪些操作,这是一个设计决策、错误处理和关系重组,一般取决于程序设计者。
表ADT
表可以用数组来实现,查找操作以线性时间执行,插入和删除操作的最坏情况为O(N)。由于插入和删除的低效以及表的大小必须事先已知,所以简单数组一般不用来实现表这种数据结构。为了避免插入和删除的时间开销,我们需要允许表可以不连续存储,否则表的部分或全部需要整体移动。程序设计中常常留出一个称之为表头(header)或哑结点(dummy node)的标志结点,它解决了几个棘手的问题:从表头插入元素;删除表头元素;一般删除问题,需要记住被删除元素前面的表元。
三个用例:
- 计算一元多项式,对于大部分项都有的稠密多项式可以用数组来实现,反之其运行时间不被接受,这时候可以用链表快速实现之。
- 实现基数排序。
- 多重表。多名学生随机选多门课(40000名学生和2500门课)用多表实现比二维数组实现高效得多。
栈ADT
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶,只有栈顶元素是可以访问的。栈有时也称LIFO(后进先出)表。同表一样,栈既可以用数组,也可以用链表来实现。由于CreateStack在栈的数组实现中需要一个初始化数组长度的参数,而在链表实现中不需要参数,因此后者的实现中不添加哑元的话,那么这个使用栈的例程就需要知道正在使用的是哪种方法。不幸的是,效率和软件理想主义常常发生冲突。
三个应用:
- 平衡符号,可以用于编译器检查程序的语法错误。
算法描述:做一个空栈,读入字符直到文件尾。如果字符是一个开放符号,则将其推入栈中。如果字符是一个封闭符号,
则当栈空时报错。否则,将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。
可以看出,算法是线性的且是在线(on-line)的。
- 后缀表达式。如操作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))转换成后缀式。
- 函数调用。不多说了,CSAPP比这里详细得多。
队列ADT
像栈一样,队列也是表。然而,使用队列时插入在一端进行而删除则在另一端进行。队列可以用数组实现也可以用链表实现。
三个应用:
- 当作业送交给一台行式打印机,它们就按照到达的顺序被排列起来。因此,被送往行式打印机的作业基本上是放在一个队列中。这个例子是关于计算机网络的。用许多中PC机的网络设置,其中磁盘是放在一台叫做文件服务器的机器上的。使用其他计算机的用户是按照先到先使用的原则访问文件的,因此其数据结构是一个队列。进一步的例子:
- 当所有的接线员忙的不可开交的时候,对大公司的传呼一般都被放在一个队列中。
- 在大规模的大学里,如果所有的终端都被占用,由于资源有限,学生们必须在一个等待表上签字。在终端上呆的时间最长的学生将首先被强制离开,而等待时间最长的学生则将是下一个被允许使用终端的用户。正如栈一样,队列还有其他丰富的用途,这样一种简单的数据结构竟然能够如此重要,实在令人惊奇。
Summary
本章描述了一些ADT的概念,并且利用三种最常见的抽象数据类型(ADT)阐述了这个概念。主要目的就是将抽象数据类型的具体实现与它们的功能分开。程序必须知道操作都做些什么,但是如果不知道如何去做实际上更好。
表、栈和队列或许在全部计算机科学中是三个基本的数据结构,大量的例子证明了它们广泛的用途。特别地。我们看到栈是如何用来记录过程和函数调用的,已经递归实际上是如何实现的。理解这些过程是非常重要的,其原因不只是因为它使得过程语言成为可能,而且还因为知道递归的实现从而消除了围绕其使用的大量谜团。虽然递归非常强大,但是它并不是完全随意的操作;递归的误用和乱用可能导致程序崩溃。
《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes的更多相关文章
- 《数据结构与算法分析:C语言描述_原书第二版》CH2算法分析_课后习题_部分解答
对于一个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这里尽自己的努力给出部分习题的详解: 不当之处,欢迎指正. 1. 按增长率排列下列函数:N,√2,N1.5,N2,N ...
- 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案
转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...
- C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
- 《数据结构与算法分析-Java语言描述》 分享下载
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
- 《模式分类(原书第二版)》pdf格式下载电子书免费下载
<模式分类(原书第二版)>pdf格式下载电子书免费下载: https://u253469.ctfile.com/fs/253469-302448505 内容简介 <模式分类>( ...
- 读书笔记:《数据结构与算法分析Java语言描述》
目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...
随机推荐
- wordpress the_date 方法 偶尔为空的问题
估计很多人遇到这个问题: 一来是the_title(),the_permalink(),the_date()一路用下来,很正常也很正确 不爱读官方文档,因为文档中有个特别提示 文档:http://co ...
- bug 发表文章不显示图片
bug 描述: 现象是我们这不能发布图片, 测试说患教方向是可以正常发布图片的(还是要感激测试,正是他们鞭策我们不断挑战困难,解决之,从而提高自己姿势水平). 图片没上传上去, 服务端协助查找发现没调 ...
- P1443 马的遍历
同样是一个bfs水题... #include <bits/stdc++.h> using namespace std; typedef pair<int, int> St; S ...
- nginx php解析过慢
nginx 报错 upstream timed out (110: Connection timed out)解决方案 error.log报错如下: 2013/05/18 21:21:36 [erro ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 面向对象之virtual
1.父类声明一个虚方法,子类可以对其进行重写(也可以不重写) 2.虚方法必须有方法体,抽象方法必须没有方法体 3.虚方法可以出现在抽象类中,抽象方法必须出现在抽象类中
- zabbix-agent passive
http://www.cnblogs.com/mysql-dba/p/5010902.html http://blog.chinaunix.net/uid-29155617-id-4668602.ht ...
- Qt持久性对象进行序列化
Mfc和Java中自定义类的对象都可以对其进行持久性保存,Qt持久性对象进行序列化当然也是必不可少的.不过这个问题还真困扰了我很长时间……Mfc通过重写虚函数Serialize().Java则是所属的 ...
- NSNotificationCenter带参
(1)post Notification类 [[NSNotificationCenter defaultCenter] postNotificationName:CRMPerformanceNewCe ...
- NAT123 解决80端口被封的问题
使用的服务器不知什么原因80端口无法使用了,好像是被封了,用的移动的固定IP,移动线路一直是不稳定 关键是移动的回答竟然是找不到哪里封的 是不是被屏蔽了,无奈使用了NAT123做处理.试了下还是管用. ...