数据结构与算法分析读书笔记系列04-栈和队列.docVIP

数据结构与算法分析读书笔记系列04-栈和队列.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构与算法分析读书笔记系列04-栈和队列 Table of Contents 1. 前言 2. 栈ADT 2.1. 栈模型 2.2. 栈的实现 2.3. 应用 3. 队列ADT 3.1. 队列模型 3.2. 队列的数组实现 3.3. 队列的应用 1?前言 每一个有意义的程序都将明晰地至少使用一种这样的数据结构,而栈则在程序中总是要间接地用到,不管你在程序中是否做了申明。 2?栈ADT 2.1?栈模型 栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有Push(进栈)和Pop(出栈),前者相当于插入,后者则是删除最后插入的元素。 栈有时又叫做LIFO(后进先出表)。上图中描述的模型只象征着Push是输入操作而Pop和Top是输出操作。普通的清空栈的操作和判断空栈的测试都是栈的操作指令系统中的一部分,但对栈能做的,基本上也就是Push和Pop操作。 下图表示在进行若干操作后的一个抽象的栈。 2.2?栈的实现 由于栈是一个表,因此任何实现表的方法都能实现栈。两个流行的实现方法,一种方法使用指针,而另一种方法则使用数组。 2.2.1?栈的链表实现 栈的第一种实现方法是使用单链表。我们通过在表顶端插入来实现Push,通过删除表顶端元素来实现Pop。Top操作只是考查表顶端元素并返回它的值。有时Pop操作和Top操作合二为一。 很清楚,所有的操作均花费常数时间,因为没有任何地方涉及到栈的大小(空栈除外),更不用说依赖于栈大小的循环了。这种实现方法的缺点在于对malloc和free的调用的开销是昂贵的。有时候可以通过使用第二个栈避免。 2.2.2?栈的数组实现 另一种实现方法避免了指针并且可能是更流行的解决方案。这种策略的唯一潜在危害是我们需要提前声明一个数组的大小。一般来说,这并不是问题,因为在典型的应用程序中,即使有很多的栈操作,在任一时刻栈元素的实际个数不会太大。不过不能做到这一点,那么节省的做法是使用链表来实现。 用一个数组实现栈是很简单的。每一个栈有一个TopOfStack,对于空栈它是-1(这就是空栈的初始化)。为了将某个元素X压入到该栈中,我们将TopOfStack加1,然后置Stack[TopOfStack] = X,其中Stack是代表具体栈的数组。为了弹出栈元素,我们置返回值为Stack[TopOfStack]然后TopOfStack减1。 注意,这些操作不仅以常数时间运行,而且是以非常快的常数时间运行。在某些机器上。若在带有自增和自减寻址功能的寄存器上操作,则(整数的)Push和Pop都可以写成一条机器指令。 2.3?应用 2.3.1?平衡符号 编译器检查你的程序语法错误,但是常常由于缺少一个符号(如遗漏一个花括号或是注释起始符)引起编译器列出上百行的诊断,而真正的错误并没有找出。 这种情况下一个有用的工具就是检验是否每件事情都能成对出现的一个程序。 2.3.2?后缀表达式 1.1 3.2 + 9.9 + 6.99 * + 上面的这个记法叫做后缀(postfix)或逆波兰(reverse Polish)记法,计算这个问题最容易的方法是使用一个栈。 2.3.3?中缀到后缀的转换 栈不仅可以用来计算后缀表达式的值,而且还可以用栈将一个标准形式的表达式(或叫做中缀式(infix))转换成后缀式。 2.3.4?函数调用 该问题类似于平衡符号的原因在于,函数调用和函数返回基本类似于开括号和闭括号,二者想法是一样的。 3?队列ADT 像栈一样,队列(queue)也是表。然而,使用队列时插入在一端进行而删除则在另一端进行。 3.1?队列模型 队列的基本操作是Enqueue(入队),它是在表的末端(叫做队尾(rear))插入一个元素,还有Dequeue(出队),它是删除(或返回)在表的开头(叫做队头(front))的元素。 3.2?队列的数组实现 如同栈的情形一样,对于队列而言任何表的实现都是合法的。像栈一样,对于每一种操作,链表实现和数组实现都给出快速的O(1)运行时间。 对于每一个队列数据结构,我们保留一个数组Queue[]以及位置Front和Rear,它们代表队列的两端。我们还要记录实际存在于队列中的元素的个数Size。所有这些信息是作为一个结构的一部分,除队列例程本身外通常不会有例程直接访问它们。下图表示处于某个中间状态的一个队列。顺便指出,图中哪些空白单元是有着不确定的值的。特别地,前两个单元含有曾经属于该队列的元素。 操作是清楚的,为使一个元素X入队,我们让Size和Rear增1,然后值Queue[Rear] = X。若使一个元素出队,我们置返回值为Queue[Front],Size减1,然后使Front增1。 对于上述实现一个潜在问题是,队列满了,下一

文档评论(0)

作为一个人力资源服务、法律文书协议顾问,我的个人优势在于具备专业知识丰富、经验丰富、服务全面、个性化解决方案等能力,能够提供客户优质的服务,并解决各种法律和人事关系方面的问题。

1亿VIP精品文档

相关文档