- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构(二)
数据结构(二) 栈和队列 栈的定义 栈(stack)又叫堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 在日常生活中,有许多类似栈的例子,如刷洗盘子时,把洗净的盘子一个接一个地向上放(相当于进栈),取用盘子时,则从上面一个接一个地向下拿(相当于出栈);又如向自动步枪的弹夹装子弹时,子弹被一个接一个地压入(相当于进栈),射击时总是后压入的先射出(相当于出栈)。 由于栈的插入和删除运算仅在栈顶一端进行,后进栈的元素必定先被删除,所以又把栈称作后进先出表(Last In First Out,简称LIFO)。 栈的顺序存储 栈的一种最简单的存储结构当然也是顺序存储。因此,可把栈的顺序存储结构所使用的记录类型定义为: type stack=reord vec:array[1..m0]of elemtype; top:Integer end 其中vec域用来顺序存储栈的元素,top域用来存储栈顶元素所在单元的编号(即下标),所以又把top称为栈顶指针,m0表示栈能够达到的最大深度(即长度)。 设一个栈为T=(1,2,3,4),栈T所对应的顺序存储结构如图1(a)所示,若在T中插入一个元素5或删除一个元素,则分别对应的顺序存储结构如图1(b)和(c)所示。在栈的顺序存储结构中,为形象地使栈顶在上,栈底在下,所以采用的单元编号是向上递增的。 栈的运算 栈的运算主要是插入和删除,除此之外,还有读取栈顶元素、置空栈和判断一个栈是否为空等。栈的运算都比较简单,具体列出如下: 1、进栈(push),即向栈顶插入一个新元素; 2、出栈(pop),即删除栈顶元素; 3、读取栈顶元素(readtop); 4、置空栈(setnull); 5、判断一个栈是否为空(empty)。 栈的应用举例 栈在计算机科学领域具有广泛地应用。比如,在编译和运行计算机语言程序的过程中,就需要利用栈进行语法检查(如检查begin和end、“(”和“)”、“[”和“]”是否配对等)、计算表达式的值、实现递归过程和函数的调用等。下面举例说明栈在这些方面的应用。 表达式的计算 队列 队列的定义 队列(queue)简称队,它也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。我们把进行插入的一端称作队尾(rear),进行删除的一端称作队首(front)。向队列中插入新元素称作进队或入队,新元素进队后就成为新的队尾元素;从队列中删除元素称作出队,出队后,其后继元素成为队首元素。由于队列的插入和删除分别在表的两端进行,所以要删除的元素是队列中最先进入的元素,因此又把队列称作先进先出(First In First Out,简称FIFO)表。 队列的顺序存储 队列的一种最简单的存储结构当然也是顺序存储,所使用的记录类型可定义为 type queue=record vec: array[1..m0]of elemtype; f,r: integer end; 其中vec域用来存储队列的元素,f和r域分别用来存储队首元素和队尾元素所在单元的编号,因此又把f和r分别称作队首指针和队尾指针。 队列的运算 1、插入算法 insert(Q,x) if Q.r = m0 then error(‘overflow’) Q.r ? Q.r + 1 {队尾指针后移} Q.vec[Q.r]?x {新元素赋给队尾单元) if Q.f = 0 then Q.f ? 1 (若原为空队,则进行插入后,同时把队首指针置为1} 2、删除算法 此算法既可写成过程的形式,也可写成函数的形式,若写成过程的形式为: delete(Q,x) if Q.f = 0 then error(‘underflow’) x ? Q.vec[Q.f] (把队首元素赋给x) if Q.f = Q.r then Q.f?0 Q.r ?0 else Q.f ?Q.f +1 3、置空队算法 此算法很简单,只要把队首和队尾指针均赋0即可。 setnull(Q) Q.f ?0 Q.r ?0 队列的应用举例 例题 合并石子 小Ray在
文档评论(0)