栈的应用

来源:互联网 发布:使命召唤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)扫描完后缀表达式,最后弹出栈顶元素即为结果。

0 0