栈的应用-算数表达式求值
时间: 2023-11-07 21:45:48 浏览: 41
算数表达式求值是栈的常见应用之一。在计算表达式中,我们需要考虑运算符的优先级。栈可以帮助我们保存优先级高的运算符,在需要时可以取出来进行计算。
具体实现步骤如下:
1. 创建两个栈:一个用来保存运算符,另一个用来保存数字。
2. 从左到右扫描表达式中的每个字符,如果是数字就入数字栈,如果是运算符就进行如下处理:
a. 如果运算符栈为空,或者栈顶运算符是左括号'(',就直接入栈。
b. 如果栈顶运算符的优先级小于当前运算符,就将当前运算符入栈。
c. 如果栈顶运算符的优先级大于等于当前运算符,就从数字栈中取出两个数字,从运算符栈中取出一个运算符,进行计算,将结果入数字栈,直到栈顶运算符的优先级小于当前运算符或者栈为空,然后将当前运算符入栈。
3. 扫描完整个表达式后,依次从数字栈和运算符栈中取出数字和运算符进行计算,直到运算符栈为空。
4. 最后数字栈中剩下的数字就是表达式的值。
例如,对于表达式"3+5*2-6/3",可以按照如下步骤进行计算:
1. 数字栈:[3]
运算符栈:[]
2. 数字栈:[3, 5]
运算符栈:[+]
3. 数字栈:[3, 5, 2]
运算符栈:[+, *]
4. 栈顶运算符"*"的优先级大于等于"/",从数字栈中取出5和2,从运算符栈中取出"*",进行计算,将结果10入数字栈。
数字栈:[3, 10]
运算符栈:[+]
5. 数字栈:[3, 10, 6]
运算符栈:[+, /]
6. 栈顶运算符"/"的优先级小于"*",直接将"/"入栈。
数字栈:[3, 10, 6]
运算符栈:[+, /]
7. 栈顶运算符"/"的优先级大于等于"+",从数字栈中取出10和6,从运算符栈中取出"/",进行计算,将结果2入数字栈。
数字栈:[3, 2]
运算符栈:[+]
8. 栈顶运算符"+"的优先级小于"-", 直接将"+"入栈。
数字栈:[3, 2]
运算符栈:[+, -]
9. 栈顶运算符"-"的优先级小于"*",直接将"*"入栈。
数字栈:[3, 2]
运算符栈:[+, -, *]
10. 栈顶运算符"*"的优先级大于等于"-", 从数字栈中取出3和2,从运算符栈中取出"*",进行计算,将结果6入数字栈。
数字栈:[6]
运算符栈:[+, -]
11. 栈顶运算符"-"的优先级大于等于"+",从数字栈中取出6和0,从运算符栈中取出"-",进行计算,将结果6入数字栈。
数字栈:[6]
运算符栈:[]
12. 最后数字栈中的数字6就是表达式的值。
这个例子中,我们用栈来保存运算符和数字,根据运算符的优先级决定是否进行计算,最后得到表达式的值。