Dijkstra双栈算术表达式求值算法
该实例实现的前提是输入的算术表达式有严格的括号。
比如:
`(1+((2*3)+(6/2)))//这种是可行的。`
1+2+3 //是不可行的
为什么会严格要求括号是因为该实例是根据右括号判断什么时候进行运算。
代码:
public class Evalauate {
public static void main(String[] args) {
Stack<Character> ops = new Stack<>(); //运算符栈
Stack<Double> vals = new Stack<>(); //操作数栈
Scanner input = new Scanner(System.in);
String next = input.nextLine(); //直接读取整行
for (int i = 0;i<next.length();i++){
char c = next.charAt(i);
if (c=='('||c=='(');
else if(c==' ');
else if(c=='+'||c=='-'||c=='*'||c=='/'){
ops.push(c);
}
else if(c==')'||c==')'){ //当遇到右括号时进行计算
char op = ops.pop();
Double val = vals.pop();
if(op=='+') val=vals.pop()+val;
else if(op=='-') val=vals.pop()-val;
else if(op=='*') val=vals.pop()*val;
else if(op=='/') val=vals.pop()/val;
vals.push(val);
}
else {
vals.push(Double.parseDouble(String.valueOf(c)));
}
}
System.out.println(vals.pop());
}
}