// 双栈算法求表达式的值,一个栈存放操作数,一个存放操作符
// 遇到)或者低优先级(或相等)则对前面的运算进行处理:操作数栈弹出两个元素,操作符栈弹出一个元素,运算结果压入操作数栈;
// 结束条件:操作符栈为空
package bishi;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class MyExpression {
public static void calcu(Stack datas, Stack ops) {
// 后弹出的放在右边
int b = (Integer) datas.pop();
int a = (Integer) datas.pop();
char op = (Character) ops.pop();
if ('+' == op) {
datas.push(a + b);
} else if ('-' == op) {
datas.push(a - b);
} else if ('*' == op) {
datas.push(a * b);
} else {
}
}
public static void main(String[] args) {
// 假定操作数为1位数,操作符为+,-,*,(,),中间没有空格等其他字符
String str = "3*(7-2*3)+5";
char[] cc = str.toCharArray();// 转为字符数组
Map<Character, Integer> mapbias = new HashMap<Character, Integer>();// 操作符的优先级
mapbias.put('(', 0);// 低优先级
mapbias.put('+', 1);
mapbias.put('-', 1);
mapbias.put('*', 2);// 高优先级运算
Stack<Integer> datas = new Stack<Integer>();
Stack<Character> ops = new Stack<Character>();
for (int i = 0; i < cc.length; i++) {
if (cc[i] >= '0' && cc[i] <= '9') {// 假定操作数是1位数
datas.push(cc[i] - '0');// 字符转整数,压栈
} else if (cc[i] == '(') {
ops.push(cc[i]);
} else if (cc[i] == ')') {
while ((Character) ops.peek() != '(') {
calcu(datas, ops);
}
ops.pop();
} else {// +,-,*
while (ops.isEmpty() == false
&& (Integer) mapbias.get(cc[i]) <= (Integer) mapbias.get(ops.peek())) {// 当前操作符的优先级小于(相等)ops栈顶操作符的优先级,则进行运算,直到高于ops栈顶操作符的优先级
calcu(datas, ops);
}
ops.push(cc[i]);// 压入当前操作符
}
}
while (ops.isEmpty() == false) {
calcu(datas, ops);
}
System.out.println(datas.pop());
}
}