You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.4 KiB
90 lines
2.4 KiB
package class_2022_08_2_week;
|
|
|
|
import java.util.Stack;
|
|
|
|
// 给定一个逆波兰式
|
|
// 转化成正确的中序表达式
|
|
// 要求只有必要加括号的地方才加括号
|
|
public class Code03_ReversePolishNotation {
|
|
|
|
// 请保证给定的逆波兰式是正确的!
|
|
public static int getAns(String rpn) {
|
|
if (rpn == null || rpn.equals("")) {
|
|
return 0;
|
|
}
|
|
String[] parts = rpn.split(" ");
|
|
Stack<Integer> stack = new Stack<>();
|
|
for (String part : parts) {
|
|
if (part.equals("+") || part.equals("-") || part.equals("*") || part.equals("/")) {
|
|
int right = stack.pop();
|
|
int left = stack.pop();
|
|
int ans = 0;
|
|
if (part.equals("+")) {
|
|
ans = left + right;
|
|
} else if (part.equals("-")) {
|
|
ans = left - right;
|
|
} else if (part.equals("*")) {
|
|
ans = left * right;
|
|
} else {
|
|
ans = left / right;
|
|
}
|
|
stack.push(ans);
|
|
} else {
|
|
stack.push(Integer.valueOf(part));
|
|
}
|
|
}
|
|
// stack 只有一个数,最终的结果
|
|
return stack.pop();
|
|
}
|
|
|
|
enum Operation {
|
|
SingleNumber, AddOrMinus, MultiplyOrDivide;
|
|
}
|
|
|
|
// 请保证输入的逆波兰式是正确的
|
|
// 否则该函数不保证正确性
|
|
// 逆波兰式仅支持+、-、*、/
|
|
// 想支持更多算术运算符自己改
|
|
public static String convert(String rpn) {
|
|
if (rpn == null || rpn.equals("")) {
|
|
return rpn;
|
|
}
|
|
String[] parts = rpn.split(" ");
|
|
Stack<String> stack1 = new Stack<>();
|
|
Stack<Operation> stack2 = new Stack<>();
|
|
for (String cur : parts) {
|
|
// cur 当前遇到的字符串
|
|
// +- */ 单数
|
|
if (cur.equals("+") || cur.equals("-")) {
|
|
String b = stack1.pop();
|
|
String a = stack1.pop();
|
|
stack2.pop();
|
|
stack2.pop();
|
|
stack1.push(a + cur + b);
|
|
stack2.push(Operation.AddOrMinus);
|
|
} else if (cur.equals("*") || cur.equals("/")) {
|
|
String b = stack1.pop();
|
|
String a = stack1.pop();
|
|
Operation bOp = stack2.pop();
|
|
Operation aOp = stack2.pop();
|
|
String left = aOp == Operation.AddOrMinus ? ("(" + a + ")") : (a);
|
|
String right = bOp == Operation.AddOrMinus ? ("(" + b + ")") : (b);
|
|
stack1.push(left + cur + right);
|
|
stack2.push(Operation.MultiplyOrDivide);
|
|
} else {
|
|
stack1.push(cur);
|
|
stack2.push(Operation.SingleNumber);
|
|
}
|
|
}
|
|
return stack1.pop();
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
// 3*(-5+13)+6/(2-3+2)-4*5*3
|
|
String rpn = "3 -5 13 + * 6 2 3 - 2 + / + 4 5 3 * * -";
|
|
System.out.println(getAns(rpn));
|
|
System.out.println(convert(rpn));
|
|
}
|
|
|
|
}
|