栈的应用
来源:互联网 发布:使命召唤11优化补丁 编辑:程序博客网 时间:2024/06/12 21:58
关于栈,我们知道是只允许在一端进行插入和删除操作的线性表,允许插入和删除的一端成为栈顶,另一端则称为栈底。
栈的应用之一 :递归
对于斐波那契数列——0 1 1 2 3 5 8 ……
如果用迭代法,我们就会借用公式:a3 = a1 + a2; a1=a2 ; a2=a3 通过循环来求。如果用递归,则是需要写好递归结束条件(n<2时,return n==0?0:1)和递归条件f(n)=f(n-1)+f(n+2),即自己调用自己即可。
之所以说递归是栈的应用是因为,函数每次在调用自己的时候都会进行现场保护,即把当前函数的局部变量、参数、返回地址等压栈,等到函数返回时再依次调用栈内元素。但这些编译器已经用栈替我们实现了,不需要用户来管理这个栈。
PS:对比迭代和递归,我们可以看到迭代是使用循环结构;递归是使用选择结构,递归会使程序代码更简洁,更容易让人理解,但是大量的递归调用会建立函数的副本,胡消耗大量的时间和内存。因此我们应该视不同情况选择不同的代码实现方式。
栈的应用之二:四则运算表达式求值
例如:9+(3-1)x3+10÷2
1.将表达式转换为后缀表达式,也叫逆波兰式:9 3 1 - 3 x + 10 2 / +
算法描述:这里借用栈来存放操作符
只要中缀表达式不为空,重复1)-4)
1)依次扫描计算表达式。
2)遇到操作数则直接输出
3)若遇到“)”,则连续出栈输出,直到遇到”(”,这里左括号出栈但不输出
4)若遇到其他操作符,比较该操作符与栈顶操作符的优先级,小于等于栈顶操作符的优先级,则连续输出,知道大于栈顶操作符的优先级结束,此时操作符进栈。(每次栈顶的操作符总是最大的,保证了计算后缀表达式计算的优先级)
5)若扫描完表达式,输出栈中剩余操作符
2.计算后缀表达式的值
算法描述:这里借用栈来存放操作数
只要后缀表达式不为空,重复1)-3)
1)从左到右顺序扫描后缀表达式
2)遇到操作数就进栈
3)遇到操作符就从栈中弹出两个操作数,执行该操作符规定的运算。(这里先出栈的放操作符的右边,后出栈的方左边)
4)扫描完后缀表达式,最后弹出栈顶元素即为结果。
- 栈&栈的应用
- 栈的应用
- 栈的应用
- 简单的栈应用
- 栈的应用
- 栈的简单应用
- 栈的应用
- 栈的应用
- hdu1022栈的应用
- 栈的应用举例
- 栈的应用
- 栈的简单应用
- 数据结构栈的应用
- 栈的简单应用
- 栈的简单应用
- 栈的应用
- 栈的应用
- 栈的经典应用
- 【机房收费个人重构—思想篇】
- leecode_338 Counting Bits
- MFC读写文件CStdioFile,CFile
- 不修改代码就能优化ASP.NET网站性能的一些方法
- 数组通过array_push函数进行排序 及 选择排序
- 栈的应用
- 开源公司黄页之阿里巴巴开源软件推荐(一)
- stc
- mybatis 找不到sql语句
- 矩阵相乘快速幂
- Yii2.0 场景的使用
- 基于Windows8与Visual Studio11开发第一个USB内核驱动程序
- 程序员的乐园
- 用Microsoft Chart Controls(MSChart)实现曲线图,并支持拖动放大到秒