Java 未省略括号的中序表达式转后序表达式
思路:
- 用一个栈暂存操作符,一个空白字符串
str
在读取中序的过程中拼接成后序表达式 - 顺序读取中序表达式
- 遇到左括号,不执行任何操作
- 遇到操作数,拼接在
str
之后 - 遇到右括号,从栈中弹出一个操作符拼接在
str
之后
实现:
public static String infixToPostfix() {
Stack<String> stack = new Stack<>();
String tmp = "";
Scanner s = new Scanner(System.in);
while(s.hasNext()) {
String str = s.next();
if(str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")) {
stack.push(str);
}else if(str.equals("(")) {
}else if(str.equals(")")) {
if(stack.isEmpty()) throw new NoSuchElementException("Stack underflow");
tmp += stack.pop() + " ";
}else {
tmp += str + " ";
}
}
return tmp;
}
中序表达式中一对括号构成的内容和后序表达式中两个操作数加上紧随其后的一个操作符都可以看成是整个表达式中的一个操作数
参考资料:
[1] Robert Sedgewick and Kevin Wayne -> https://algs4.cs.princeton.edu/13stacks/InfixToPostfix.java.html