输出一行字符串,代表str(保证str计算的结果不会出现除零,int溢出等情况)。
输出一个整数,代表表达式的计算结果。
48*((70-65)-43)+8*1
-1816
3+1*4
7
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Stack; import java.util.LinkedList; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String expression = br.readLine().trim(); System.out.println(process(expression.toCharArray(), 0)[0]); } // 计算表达式expression从i开始到第一个遇到的右括号或字符串尾的结果 private static int[] process(char[] expression, int i) { Stack<String> stack = new Stack<>(); int num = 0; while(i < expression.length && expression[i] != ')'){ if(expression[i] >= '0' && expression[i] <= '9'){ // 遇到数字 num = num * 10 + expression[i] - '0'; i++; }else if(expression[i] != '('){ // 遇到运算符 addNum(stack, num); stack.push(String.valueOf(expression[i])); num = 0; i++; }else{ // 遇到左括号或结尾 int[] pair = process(expression, i + 1); // 跳过左括号算后面的表达式 num = pair[0]; i = pair[1] + 1; } } addNum(stack, num); return new int[]{getNum(stack), i}; } private static void addNum(Stack<String> stack, int cur) { if(!stack.isEmpty()){ String opt = stack.pop(); if(opt.equals("+") || opt.equals("-")){ stack.push(opt); }else{ // 栈顶为乘除运算,先计算再压栈 int prev = Integer.parseInt(stack.pop()); cur = opt.equals("*")? prev * cur: prev / cur; } } stack.push(String.valueOf(cur)); } private static int getNum(Stack<String> stack) { LinkedList<String> que = new LinkedList<>(stack); // 最后清算阶段得从左往右计算,还是得顺序表 int res = 0; boolean add = true; int num = 0; while(!que.isEmpty()){ String cur = que.pollFirst(); if(cur.equals("+")){ add = true; }else if(cur.equals("-")){ add = false; }else{ num = Integer.valueOf(cur); res += add? num: -num; } } return res; } }