您的位置:首页 > 其它

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