例子
例题1
- 后缀表达式表示为:
8 4 + 6 2 * -
- 中缀表达式
8+4-6*2
例题2
- 后缀表达式:
70 30 + 20 * 10 2 / + 3 -
- 中缀表达式:
(70 + 30) *20 + 10 / 2 - 3
例题3
- 后缀表达式:
10 3 * 3 1 - 2 * + 10 2 / -
- 中缀表达式:
10 * 3 +(3-1)* 2 - 10 / 2
例题3:
- 后缀表达式表示为:
3 5 + 2 * 7 1 /4 - +
- 中缀表达式
2*(3+5)+7/1-4
注意:当前没有小数点,只有加减乘除
题目解析
- 初始化一个栈。
- 从左到右扫描后缀表达式中的符号,有两种情况:
- 如果是数字,则直接压栈。
- 如果是运算符op,则从栈顶弹出两个元素a和b(b为栈顶元素),然后将(a op b)压栈。
public static String back_medium(String[] strs){
Stack<String> stack = new Stack<>();
for (int i = 0; i < strs.length; i++){
if (Character.isDigit(strs[i].charAt(0))){ // 是数字
stack.push(strs[i]);
}else{ // 不是数字
if (stack.size() < 2){
throw new RuntimeException("表达式错误");
}
// 从栈底到栈顶
String top = stack.pop();
String button = stack.pop();
String t = "(" + button+ strs[i] + top + ")";
stack.push(t);
}
}
if (stack.empty()){
throw new RuntimeException("表达式错误");
}
return stack.pop();
}
public static void main(String[] args) {
System.out.println(back_medium(new String[]{"70", "30", "+", "20", "*", "10", "2", "/", "+", "3", "-"}));
}