Dijkstra双栈表达式求值算法
2017-12-11 00:00
281 查看
以表达式"(1+((2+3)*(4*5)))"为例:
算法分四个步骤:
将操作数压入操作数栈
将运算符压入运算符栈
忽略左括号
在遇到右括号时,弹出一个运算符并弹出所需数量的操作数,运算结果并将结果压入操作数栈
处理完最后一个右括号后,操作数栈中只剩下一个数,就是表达式的值。
算法分四个步骤:
将操作数压入操作数栈
将运算符压入运算符栈
忽略左括号
在遇到右括号时,弹出一个运算符并弹出所需数量的操作数,运算结果并将结果压入操作数栈
处理完最后一个右括号后,操作数栈中只剩下一个数,就是表达式的值。
public class expression { public static void main(String[] args) { Stack<Character> ops = new Stack<Character>();//运算符栈 Stack<Integer> vals = new Stack<Integer>();//操作数栈 String str = "(1+((2+3)*(4*5)))"; for(int i=0;i<str.length();i++) { char ch = str.charAt(i); if(ch == '(');//忽略左括号 else if(ch == '+' || ch == '-' || ch == '*' || ch =='/') ops.push(ch);//操作数压入操作数栈 else if(ch == ')') { char op = ops.pop(); int v = vals.pop(); if(op == '+') v = vals.pop() + v; if(op == '-') v = vals.pop() - v; if(op == '*') v = vals.pop() * v; if(op == '/') v = vals.pop() / v; vals.push(v); } else vals.push(Integer.parseInt(String.valueOf(ch)));//运算符压入运算符栈 } System.out.println(vals.pop()); } }
相关文章推荐
- 算法(第四版) Dijkstra 算数表达式求值算法-双栈
- 算法-表达式求值(Dijkstra双栈)
- Dijkstra的双栈算数表达式求值算法
- Dijkstra 的双栈算数表达式求值算法的学习
- 《算法》第一章——Dijkstra双栈表达式求值
- Dijkstra的双栈算法表达式求值算法
- 【算法】E.W.Dijkstra算术表达式求值
- 蓝桥杯-表达式求值(Dijkstra双栈)
- 经典算法-算术表达式求值
- 算法表达式求值
- Dijkstra双栈算数表达式求值算法的过程与分析
- 表达式求值的经典算法
- 后缀表达式的求值的算法
- 表达式求值算法的实现
- 数据结构 算法3.4(栈的应用) 表达式求值(stl版and数组模拟版)
- 表达式求值算法总结
- 蓝桥杯 算法训练 表达式的计算(中缀转后缀表达式求值)
- 一个支持函数,浮点数表达式求值算法
- 经典算法-算术表达式求值
- 表达式求值及转换算法