一、中缀表达式转换为后缀表达式
①扫描中缀表达式。
②遇到数字将其存入后缀表达式。
③遇到左括号将其入栈。
④遇到右括号,出栈运算符并存入后缀表达式,直至遇到左括号,将左括号出栈结束。
⑤遇到运算符,出栈运算符并存入后缀表达式,直到栈顶为优先级更小的运算符、左括号或空栈,将遇到的运算符入栈结束。
⑥扫描结束后将栈中的所有运算符出栈并存入后缀表达式。
二、后缀表达式求解
①扫描后缀表达式。
②遇到数字时将其入栈。
③遇到运算符出栈两个数字进行运算,将结果入栈。
④扫描结束后栈顶的数字即为最终结果。
三、实现
import java.util.HashMap; import java.util.LinkedList; import java.util.Scanner; import java.util.Stack; public class Calculator { private static LinkedList<String> translate(String exp) { HashMap<Character, Integer> priority = new HashMap<>(); priority.put(‘+‘, 0); priority.put(‘-‘, 0); priority.put(‘*‘, 1); priority.put(‘/‘, 1); LinkedList<String> linkedList = new LinkedList<>(); Stack<Character> stack = new Stack<>(); StringBuilder temp = new StringBuilder(); for (int i = 0; i < exp.length(); i++) { char c = exp.charAt(i); if (Character.isDigit(c)) { temp.append(c); if (i + 1 == exp.length() || !Character.isDigit(exp.charAt(i + 1))) { linkedList.add(temp.toString()); temp.delete(0, temp.length()); } } else if (c == ‘(‘) { stack.push(c); } else if (c == ‘)‘) { while (!stack.empty() && !stack.peek().equals(‘(‘)) linkedList.add(stack.pop().toString()); stack.pop(); } else { while (!stack.empty() && !stack.peek().equals(‘(‘) && priority.get(c) >= priority.get(stack.peek())) linkedList.add(stack.pop().toString()); stack.push(c); } } while (!stack.empty()) linkedList.add(stack.pop().toString()); return linkedList; } public static int solve(String exp) { LinkedList<String> linkedList = translate(exp); Stack<Integer> cache = new Stack<>(); for (String str : linkedList) try { cache.push(Integer.parseInt(str)); } catch (NumberFormatException exc) { int rhs = cache.pop(); int lhs = cache.pop(); switch (str) { case "+": cache.push(lhs + rhs); break; case "-": cache.push(lhs - rhs); break; case "*": cache.push(lhs * rhs); break; case "/": cache.push(lhs / rhs); break; } } return cache.pop(); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String expr = scanner.nextLine(); System.out.println(solve(expr)); } }