数据结构(六)——栈的应用
来源:互联网 发布:mac mini是什么 编辑:程序博客网 时间:2024/06/06 21:03
栈的应用:
递归
栈有一个很重要的应用:在程序设计语言中实现了递归。下面介绍一个经典的递归例子:斐波那契数列。
1,1,2,3,5,8,13,21,34,45,........这样的数列有很明显的规律,前两项和为第三项的值。用数学函数就是这样的:
如果想打印前40位数字,我们首相想到的就是用迭代法来实现,这里代码就不演示了,而用递归就能比迭代更加简单一些。代码如下:
递归的定义:把一个直接调用自己或者通过一系列的调用语句间接地调用自己的函数,称作递归函数。每个递归定义必须 至少有一个条件,满足时不再进行递归,即不再引用自身而是返回值退出。
四则运算表达式求值:
后缀表达法:
举个例子,9+(3-1)*3+10/2这个表达式用后缀表达法应该是“9 3 1 -3 * + 10 2 / +”。
举个例子,9+(3-1)*3+10/2这个表达式用后缀表达法应该是“9 3 1 -3 * + 10 2 / +”。
规则(以上述式子举例):
1.初始化一个空栈,此栈用来对应运算的数字进出使用
2.后缀表达式中前三个都是数字,所以9,3,1进栈
3.接下来是“-”,将栈中的1出栈作为减数,3作为被减数,运算得到2,2进栈
4.接着3进栈
5.后面是“*”,所以3,2出栈得到6,6进栈
6.下面是“+”,然后6,9出栈得到15,15进栈
7.接着是10与2进栈
8.然后是符号“/”,所以2,10出栈得到5,5进栈
9.最后一个符号是“+”,15和5出栈得到20,20进栈
10.最后20出栈,栈为空
2.后缀表达式中前三个都是数字,所以9,3,1进栈
3.接下来是“-”,将栈中的1出栈作为减数,3作为被减数,运算得到2,2进栈
4.接着3进栈
5.后面是“*”,所以3,2出栈得到6,6进栈
6.下面是“+”,然后6,9出栈得到15,15进栈
7.接着是10与2进栈
8.然后是符号“/”,所以2,10出栈得到5,5进栈
9.最后一个符号是“+”,15和5出栈得到20,20进栈
10.最后20出栈,栈为空
那么怎么将中缀表达式转化为后缀表达式呢?
1. 初始化一空栈,用来对符号进出栈使用。
2. 第一个字符是数字9,输出9,后面是符号“+”,进栈。
3. 第三个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。
4. 第四个字符是数字3,输出,总表达式为9 3,接着是“-”进栈。
5. 接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”,总的输出表达式为9 3 1 -
6. 接着是数字3,输出,总的表达式为9 3 1 - 3 。紧接着是符号“*”,因为此时的栈顶符号为“+”号,优先级低于“*”,因此不输出,进栈。
7. 之后是符号“+”,此时当前栈顶元素比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”号更低的优先级,所以全部出栈),总输出表达式为 9 3 1 - 3 * +.然后将当前这个符号“+”进栈。也就是说,前6张图的栈底的“+”是指中缀表达式中开头的9后面那个“+”,而下图中的栈底(也是栈顶)的“+”是指“9+(3-1)*3+”中的最后一个“+”。
8. 紧接着数字10,输出,总表达式变为9 3 1-3 * + 10。
9. 最后一个数字2,输出,总的表达式为 9 3 1-3*+ 10 2
10. 因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为 9 3 1-3*+ 10 2/+
2. 第一个字符是数字9,输出9,后面是符号“+”,进栈。
3. 第三个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。
4. 第四个字符是数字3,输出,总表达式为9 3,接着是“-”进栈。
5. 接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”,因此输出“-”,总的输出表达式为9 3 1 -
6. 接着是数字3,输出,总的表达式为9 3 1 - 3 。紧接着是符号“*”,因为此时的栈顶符号为“+”号,优先级低于“*”,因此不输出,进栈。
7. 之后是符号“+”,此时当前栈顶元素比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”号更低的优先级,所以全部出栈),总输出表达式为 9 3 1 - 3 * +.然后将当前这个符号“+”进栈。也就是说,前6张图的栈底的“+”是指中缀表达式中开头的9后面那个“+”,而下图中的栈底(也是栈顶)的“+”是指“9+(3-1)*3+”中的最后一个“+”。
8. 紧接着数字10,输出,总表达式变为9 3 1-3 * + 10。
9. 最后一个数字2,输出,总的表达式为 9 3 1-3*+ 10 2
10. 因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为 9 3 1-3*+ 10 2/+
0 0
- 数据结构(六)——栈的应用
- 算法导论(六)——扩充的数据结构的应用
- 数据结构—栈的应用
- 数据结构——六
- Lua数据结构 — lua_State(六)
- Lua数据结构 — lua_State(六)
- 数据结构——栈的应用
- 数据结构——栈的应用举例
- 数据结构与算法(7)— 栈的应用
- 数据结构—递归的应用
- GNU Toolchain —— (六)gprof的应用
- PHP数据结构之六 PHP栈的应用举例【数制转换和括号匹配算法】
- 数据结构——栈应用
- 大话数据结构六:特殊的线性表(栈)
- 大话数据结构六:特殊的线性表(栈)
- 数据结构学习笔记(六)-- 栈的顺序结构
- 数据结构学习(六)——循环顺序队列的操作
- 数据结构——六种Sort方法的代码实现
- kafka-node
- OPENCV HS算法源码
- HDU1274 Hat’s Words(字典树 数组实现)
- 图像缩放双立方插值
- DB2 define external scalar java user-defined function
- 数据结构(六)——栈的应用
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
- 耳机控制小说翻页
- smtplib发送带SSL认证的邮箱系统
- read write 替代 send recv
- 面试总结(大公司)
- HttpClient的get,post方法请求网络数据,Handler+子线程
- 矩阵的物理意义(一)
- java Calendar 日期获取工具类,昨日开始时间,昨日结束时间,当前周周一日期,当前时间上月第一天,获取当前年第一天