中缀表达式计算结果.txt
UP 返回
public class LeetCode01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// String str = scanner.nextLine().trim();
String str = "2*(-2.11+(-1+3)*(-5.5))-7.6/(-11)";
System.out.println(calFormula(str));
//2*(2+(1+3)*5)-7/11
}
private static String calFormula(String formula) {
Stack<Character> symbolStack = new Stack<>();
Stack<String> afterStack = new Stack<>();
boolean canNum = true;
String num = "";
for (int i = 0; i < formula.length(); i++) {
char c = formula.charAt(i);
if (isSymbol(c)) {
if (c == '-' && canNum) {
num += c + "";
canNum = false;
} else {
if (!"".equals(num)) {
afterStack.push(num);
num = "";
}
while (!highCome(c, symbolStack) && symbolStack.peek() != '(') {
afterStack.push(symbolStack.pop() + "");
}
symbolStack.push(c);
canNum = false;
}
} else if (c == '(') {
if (!"".equals(num)) {
afterStack.push(num);
num = "";
}
symbolStack.push('(');
canNum = true;
} else if (c == ')') {
if (!"".equals(num)) {
afterStack.push(num);
num = "";
}
while (symbolStack.size() != 0 && symbolStack.peek() != '(') {
afterStack.push(symbolStack.pop() + "");
}
if (symbolStack.size() != 0) {
symbolStack.pop();
}
canNum = false;
} else {
num += c + "";
canNum = false;
}
}
if (!"".equals(num)) {
afterStack.push(num);
}
while (symbolStack.size() != 0) {
afterStack.push(symbolStack.pop() + "");
}
// System.out.println(afterStack);
return calStack(afterStack);
}
private static String calStack(Stack<String> afterStack) {
Stack<String> calStack = new Stack<>();
for (String s : afterStack) {
if (isSymbol(s)) {
String right = calStack.pop();
String left = calStack.pop();
String result = calSingle(left, right, s);
calStack.push(result);
// System.out.println(result);
} else {
calStack.push(s);
}
}
return calStack.pop();
}
private static boolean highCome(char c, Stack<Character> symbolStack) {
if (symbolStack.size() == 0) {
return true;
}
if ((c == '*' || c == '/') && (symbolStack.peek() == '+' || symbolStack.peek() == '-')) {
return true;
}
return false;
}
private static boolean isSymbol(char c) {
return isSymbol(c + "");
}
private static boolean isSymbol(String c) {
return "+".equals(c) || "-".equals(c) || "*".equals(c) || "/".equals(c);
}
private static String calSingle(String left, String right, String symbol) {
Double a = Double.parseDouble(left);
Double b = Double.parseDouble(right);
// System.out.print(left + symbol + right + "=");
switch (symbol) {
case "+":
return a + b + "";
case "-":
return a - b + "";
case "*":
return a * b + "";
case "/":
return a / b + "";
}
return "";
}
}
DOWN 返回