收藏 分享(赏)

数据结构与算法的JavaScript实现及应用-Stack-递归-汉诺(1).doc

上传人:eukav 文档编号:4853039 上传时间:2019-01-16 格式:DOC 页数:2 大小:17KB
下载 相关 举报
数据结构与算法的JavaScript实现及应用-Stack-递归-汉诺(1).doc_第1页
第1页 / 共2页
数据结构与算法的JavaScript实现及应用-Stack-递归-汉诺(1).doc_第2页
第2页 / 共2页
亲,该文档总共2页,全部预览完了,如果喜欢就下载吧!
资源描述

1、数据结构与算法的 JavaScript 实现及应用:Stack/ 递归/汉诺 (1)在这篇文章里,我将介绍数据结构 Stack 的基本操作和它的一些应用。我们将看到 Stack 在括号匹配检测,表达式求值,函数调用上的应用。AD:在这篇文章里,我将介绍数据结构 Stack 的基本操作和它的一些应用。我们将看到 Stack 在括号匹配检测,表达式求值,函数调用上的应用。递归是一种特殊的函数调用,由于递归在程序设计中十分重要且不容易理解,所以我将阐述我对递归的理解。最后我们将看到利用 Stack 和递归是怎么优雅的解决一个经典游戏:汉诺塔。本文还将给出表达式求值和汉诺塔的 HTML5 演示。Sta

2、ckStack 即栈,以下是维基百科的定义:在计算机科学中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆栈顶端指标,英语:top )进行加入资料(英语:push)和输出资料(英语:pop)的运算。另外堆栈也可以用一维阵列或连结串行的形式来完成。根据定义我们知道栈只有三种操作:入栈(push),出栈(pop),获取栈顶元素(top)。而且栈只能够操纵栈顶元素,即只能在一端进行操作。由于栈具有后进入的元素率先弹出的性质,栈又被称为后进先出(LIFO, Last In First Out)的结构。栈的操作十分简单,我们可以用单链表(LinkedList)和数

3、组来实现栈。然而在 JavaScript 中,Array 自带 pop(), push()的操作,而且我们可以利用 ArrayArray.length-1来实现 top()操作。所以没有必要去另外实现一个 Stack 类型,用 Array 表达即可。Stack 的 LIFO 的特性使得其适于解决许多实际问题,以下我们选取它的三个应用来加以阐述。括号匹配检测我们平时在编辑器中写代码时,有些高山茶 编辑器会自动检测括号是否前后匹配,不匹配的话则会报错提示。利用 Stack 的 LIFO 的特性,我们可以轻松实现这个功能。算法的伪代码如下:新建一个 Stacks s=newstack() 读取字符

4、直至读完 whilereadtoc!=EOF: 如果字符是开放括号如(等,入栈 ifcisopening: s.push(c) 如果字符是结束括号如) elseifcisclosing: 若栈为空或者栈顶元素与开放括号不匹配则报错 ifsisemptyorfs.pop()isnotcorrespondtoc: returnerror! 若最后栈不为空,报错 ifsisnotempty: returnerror! 如果没有返回报错,则返回正常 returnok算法的原理为,遇到一个结束的括号时,我们总是要查找最后一个开放的括号是否与之匹配,若找不到开放的括号,或最后一个开放的括号不匹配,则报错。

5、由于总是而且仅需要寻找最后一个元素水草玛瑙 ,所以我们将开放的括号入栈,匹配时则出栈。由于 Stack 的特性,这个算法简单明了,且消耗的时间复杂度为线性级 O(n)。表达式求值Stack 的强大特性,也使得其能够运用在表达式求值上。设想一个表达式:2+4(3-1)这个表达式具备了三种类型的符号:运算数:2 4 2 2运算符:+ -圆括号:()计算它的算法如下:分配两个栈,ops 为运算符栈,nums 为数字栈 ops=newStack,nums=newStack 从表达式中读取字符直至结束 whilereadcinexpression!=EOF: 若为左括号,入运算符栈 ifcis(: op

6、s.push(c) 若为数字,入数字栈 elseifcisanumber: nums.push(c) 若为操作符 elseifcisanoperator: 若运算符栈的栈顶元素比 c 的优先级高或一样高,则进行单次运算 whileops.top()isequalorprecedenceoverc: op=ops.pop() opn2=nums.pop() opn1=nums.pop() 进行单次运算,并把运算数入数字栈 nums.push(cal(op,opn1,opn2) 若为右括号 elseifcis): 除非栈顶元素为左括号,否则运算符栈出栈并将计算结果入数字栈 op=ops.pop()

7、 whileop!=(: opn2=nums.pop() opn1=nums.pop() nums.push(cal(op,opn1,opn2) op=ops.pop() 返回数字栈的栈顶元素 returnnums.top()以下是表达式求值的 DEMO:我们在调试代码的时候,碰到函数报错时经常会发现如下类似的报错提示:UserstimCodesJavaScriptdsaginjsDSinJSStackInfixExpression.js:59returnpriotya)priotyb; SyntaxError:Unexpectedtoken) atModule._compile(module

8、.js:439:25) atObject.Module._extensionsjs(module.js:474:10) atModule.load(module.js:356:32) atFunction.Module._load(module.js:312:12) atFunction.Module.runMain(module.js:497:10) atstartup(node.js:119:16) atnode.js:902:3其实我们只是在一处出错了,为什么会打印出这么多报错信息呢?原因就在于解释器把报错的函数经过的所有调用函数的栈打印了出来。在函数调用的时候,我们需要切换到被调用的函数上,但是一旦函数调用结束,我们还得回到原来的位置。利用栈,我们可以有条不紊的实现这点,即在函数调用的时候,我们把当前函数的变量和上下文入栈,等函数调用结束,我们再出栈,获取之前的上下文和变量。1 2 下一页 查看全文 内容导航第 1 页:应用 第 2 页:递归 鸟哥的 Linux 私房菜 基础学习篇(第二版)本书全面而详细地介绍了 Linux 操作系统。全书分为 5 个部分:第一部分着重说明 Linux 的起源及功能,如何规划和安装 Linux 主机;第二部

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > Java

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报