- 1、本文档共2页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
路漫漫其修远兮,吾将上下而求索 -
路漫漫其修远兮,吾将上下而求索 - 百度文库
11
11
数据结构与算法的JavaScrip实t 现及应用:Stack递/ 归/汉诺(1)
在这篇文章里,我将介绍数据结构 Stack的基本操作和它的一些应用。我们将看到 Stack在括号匹配检测,表达式求值,函数调用上的应用。
AD :
在这篇文章里,我将介绍数据结构Stack的基本操作和它的一些应用。我们将看到Stack在括号匹配检测,表达式求值,函数调用上的应用。
递归是一种特殊的函数调用,由于递归在程序设计中十分重要且不容易理解,所以我将阐述我对递归的理解。
最后我们将看到利用Stack和递归是怎么优雅的解决一个经典游戏:汉诺塔。本文还将给出表达式求值和汉诺塔的HTML5 演示。
Stack
Stack即栈,以下是维基百科的定义:
在计算机科学中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆栈顶端指标,英语:top)进行加入资料(英语:push)和输出资料(英语:pop)的运算。另外堆栈也可以用一维阵列或连结串行的形式来完成。
根据定义我们知道栈只有三种操作:入栈(push),出栈(pop),获取栈顶元素(top。)够操纵栈顶元素,即只能在一端进行操作。
而且栈只能
由于栈具有后进入的元素率先弹出的性质,栈又被称为后进先出(LIFO, Last In First的O结ut构) 。栈的操作十分简单,我们可以用单链表(LinkedList和)数组来实现栈。
然而在 JavaScrip中t ,Array自带 pop(),push()的操作,而且我们可以利用 Array[Array.length-1]
来实现top(操) 作。所以没有必要去另外实现一个Stack类型,用 Array表达即可。
Stack的 LIFO 的特性使得其适于解决许多实际问题,以下我们选取它的三个应用来加以阐述。括号匹配检测
我们平时在编辑器中写代码时,有些高山茶 编辑器会自动检测括号是否前后匹配, 不匹配的话则会报错提示。
利用 Stack的 LIFO 的特性,我们可以轻松实现这个功能。算法的伪代码如下:
新建一个 Stackss=newstack()读取字符直至读完 whilereadtoc!=EOF:如果字符是开放括号如
([等,{入栈 ifcisopenings:.push(c)如果字符是结束括号如)]el}seifcisclosi若ng栈: 为空或
者栈顶元素与开放括号不匹配则报错 ifsisemptyorfs.pop()isnotcorrespornedttuorcn:error若! 最后栈不为空,报错 ifsisnotempty: returner如ro果r!没有返回报错,则返回正常 returnok
算法的原理为,遇到一个结束的括号时,我们总是要查找最后一个开放的括号是否与之匹配, 若找不到开放的括号,或最后一个开放的括号不匹配,则报错。
由于总是而且仅需要寻找最后一个元素水草玛瑙 ,所以我们将开放的括号入栈,匹配时则出栈。
由于 Stack的特性,这个算法简单明了,且消耗的时间复杂度为线性级O(n)。表达式求值
Stack的强大特性,也使得其能够运用在表达式求值上。设想一个表达式:2+4(3-1)
这个表达式具备了三种类型的符号: 运算数:2 4 2 2
运算符:+ - 圆括号:()
计算它的算法如下:
分配两个栈,ops 为运算符栈,nums 为数字栈 ops=newStack,nums=newStack从表达式中读取字符直至结束 whilereadcinexpression!=EO若F:为左括号,入运算符栈 ifcis(: ops.pus若h(为c)
路漫漫其修远兮,吾将上下而求索 -
路漫漫其修远兮,吾将上下而求索 - 百度文库
22
22
数字,入数字栈 elseifcisanumber: nums.push若(c为) 操作符 elseifcisanoperat若or运: 算符栈的栈
顶元素比 c 的优先级高或一样高,则进行单次运算 whileops.top()isequalorprecedenceoverc: op=ops.pop()opn2=nums.pop() opn1=nums.pop() 进行单次运算, 并把运算数入数字栈nums.push(cal(op,opn1,opn2若))为右括号 elseifcis除)非: 栈顶元素为左括号,否则运算符栈出
栈并将计算结果入数字栈 op=ops.pop()whileop!=(o:pn2=nums.pop() opn1=nums.pop() nums.push(cal(op,opn1,opn2)) op=ops.p返op回()数字栈的栈顶元素 r
文档评论(0)