/*
* 双栈算术表达式(未省略括号)求值算法
* 用两个栈(一个用于保存运算符,一个用于保存操作数)
* 1.将操作数压入操作数栈;
* 2.将运算符压入运算符栈;
* 3.忽略左括号;
* 4.在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈;
*/
public class Evaluate {
public static void main(String[] args) throws IOException {
//String expression="((8*(3+2))/(2+8))";
String expression = "(1+((2+3)*(4*5)))";
evaluate(expression);
}
public static void evaluate(String expression) {
Stack<Character> ops = new Stack<>();
Stack<Double> vals = new Stack<>();
for(int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == '(') ;
else if(c == '+') ops.push(c);
else if(c == '-') ops.push(c);
else if(c == '*') ops.push(c);
else if(c == '/') ops.push(c);
else if(c == ')') {
/*如果字符是“(”,弹出运算符和操作数,计算结果并压入操作数栈*/
char op = ops.pop();
Double 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 {
/*如果字符既非运算符也非括号,将它作为double值压入操作数栈*/
vals.push(Double.parseDouble(String.valueOf(c)));
}
}
System.out.println(vals.pop());
}
}
双栈实现 表达式求值
最新推荐文章于 2024-03-05 23:19:47 发布