数据结构与算法分析 chapter03-表、栈和队列

1.表(TODO)

2.栈

方法调用

  • 检测平衡符号的算法提出一种在编译的过程语言和面向对象语言中实现方法调用的方式。这里的问题是,当调用一个新方法时,主调例程的所有局部变量需要由系统存储起来,否则被调用的新方法将会重写由主调例程的变量所使用的内存。不仅如此,该主调例程的当前位置也必须要存储,以便在新方法运行完后知道向哪里转移。这些变量一般由编译器指派给机器的寄存器,但存在某些冲突(通常所有的方法都是获取指定给1号寄存器的某些变量),特别是涉及递归的时候。该问题类似于平衡符号的原因在于,方法调用和方法返回基本上类似于开括号和闭括号,二者相同的想法应该是行得通的。
  • 当存在方法调用的时候,需要存储的所有重要信息,诸如寄存器的值(对应变量的名字)和返回地址(它可在程序计数器得到,一般情况是在一个寄存器止中)等,都要以抽象的方式存在“一张纸上”并被置于一个堆(pile)的顶部。然后控制转移到新方法,该方法自由地用它的一些值代替这些寄存器。如果它又进行其他的方法调用,那么它也遵循相同的过程。当该方法要返回时,它查看堆顶部的那张“纸”并复原所有的寄存器,然后进行返回转移。
  • 显然,所有全部工作均可由一个栈来完成,而这正是在实现递归的每一种程序设计语言中实际发生的事实。所存储的信息或称为活动记录,或叫做栈帧。在典型的情况下,需要做些微调整:当前环境是由栈顶描述的。因此,一条返回语句就可给出前面的环境(不用复制)。在实际计算机中的栈常常是从内存分区的高端向下增长,而在许多非java系统中是不检查溢出的。由于有太多的同时在运行的方法,因此栈空间用尽的情况总是可能发生的。显而易见,栈空间用尽常是致命的错误。
  • 在不进行栈溢出检测的语言和系统中,程序将会崩溃而没有明显的说明;而在java中会抛出一个异常
    *在正常情况下我们不应该越出栈空间,发生这种情况通常是由失控递归的指向引起。
    递归总能够与被彻底去除(编译器是在转变成汇编语言时完成递归去除的),但是这么做是相当冗长乏味的。一般方法是要求使用一个栈,而且当且仅当你能够把最低限度的最小值放到栈上时这个方法才值得一用。非递归程序一般说来确实比等价的递归程序要快,但是速度优势的代价却是由于去除递归而使用程序清晰性受到了影响

3.队列

队列的数组实现

  对于每一个队列数据结构,我们保留一个数组theArray以及位置front和back,它们代表队列的两端。我们还要记录实际存在于队列中的元素的个数currentSize。下图表示某个中间状态的一个队列

array.png

 操作应该是清楚的。为使一个元素x入队(即执行enqueue),我们让currentSizeback增1,然后置theArray[back]=x。 若使元素dequeue(出列),我们置返回值为theArray[front],且currentSize减1,然后使front增1。也可以有其他的方法(将在后面讨论)。现在论述错误检测。
 上述实现存在一个潜在的问题。经过10次enqueue后队列似乎是满了,因为back现在是数组的最后一个下标,而下一次再enqueue就会是一个不存在的位置。然而,队列中也许只存在几个元素,因为若干元素可能已经出队了。像栈一样,即使在有许多操作的情况下队列也常常不是很大。
 简单的解决方法是,只要frontback到达数组的尾端,它就又绕回道开头。下面诸图显示在某些操作期间的队列情况。这叫做循环数组的实现。
 实现回绕所需要的附加代码是极小的(不过它可能使得运行时间加倍)。如果frontback增1导致超越了数组,那么其值就要重置到数组的第一个位置。
queue.png

队列为空时(back=fromt-1),队列的大小可以通过比较back跟front隐式地算出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,603评论 1 19
  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,167评论 8 114
  • 黑夜在狂风中怒吼 月亮 带着狰狞的清冷 雾 氤氲着远方 我行走在路上 没有拐杖 我知道 阳光之剑终会刺破黑暗 破旧...
    林若一Vera阅读 477评论 3 5
  • 2017年5月25日赵梓映亲子日记 李阳1402017.05.27 2017年5月25日 星期四 天气:晴 赵梓映...
    冬的精灵阅读 182评论 0 0
  • 心里住着一个老太婆 很冷静,很冷漠。 常有人对她说: 记得, 给多肉晒太阳。 对了, 给它浇矿泉水。 它不像你, ...
    蒸只鱼阅读 411评论 0 1