import java.util.Stack;
public class Main {
public static void main(String[] args) {
String s = "1+((2+3)*4)-5";
//将中缀表达式转换成后缀表达式
String str = parseToSuffixExpression(s);
System.out.println(str);
//运算
int res = calc(str);
System.out.println(res);
}
public static int calc(String str) {
Stack<Integer> stack = new Stack<>();
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
if (Character.isDigit(ch)) {
stack.push(Integer.valueOf(String.valueOf(ch)));
} else {
int n2 = stack.pop();
int n1 = stack.pop();
int n = clc(n1,n2,ch);
stack.push(n);
}
}
return stack.pop();
}
public static int clc(int n1,int n2,char c) {
int res = 0;
if (c == '+') {
res = n1 + n2;
} else if (c == '-') {
res = n1 - n2;
} else if (c == '*') {
res = n1 * n2;
} else if (c == '/') {
res = n1 / n2;
}
return res;
}
//中缀表达式转后缀表达式
public static String parseToSuffixExpression(String str) {
Stack<Character> s = new Stack<>();//保存操作符
StringBuilder sb = new StringBuilder();
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
if (Character.isDigit(ch[i])) {
sb.append(ch[i]);
} else if (ch[i] == ')') {
while (s.peek() != '(') {
sb.append(s.pop());
}
//s.peek()=='('
s.pop();
} else {
if (ch[i] == '(') {
s.push(ch[i]);
}else if (s.empty() || s.peek() == '(' || priority(ch[i]) > priority(s.peek())) {
s.push(ch[i]);
} else {
sb.append(s.pop());
s.push(ch[i]);
}
}
}
while (!s.empty()) {
sb.append(s.pop());
}
return sb.toString();
}
//操作符的优先级
public static int priority(char c) {
if (c == '*' || c == '/') {
return 1;
} else if (c == '+' || c == '-') {
return 0;
} else {
return -1;
}
}
}
java逆波兰计算器(中缀转后缀表达式)
于 2022-05-06 21:18:02 首次发布