题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
//本题思路还是比较复杂 //由于*/ 和 +-优先级不一样, 所以分为num1 num2 o1 o2两个操作数两个运算符 //遇到数字时因为不知道后面的运算符 所以优先让数字与高优先级的乘除运算保留在num2, 再通过1*1=1使一个数字也能保留原始结果 //遇到+-时 代表前后优先级一样 所以更新num1 o1, 重置num2 o2 //遇到左括号, 所有操作数,符号进栈, 重置所有操作数,符号 //遇到右括号, 更新num2,o2 , 保留num1, o1 //最后结果 res = num1+ num2*o1 import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); Stack<Integer> stack = new Stack<>(); int num1= 0; int o1 = 1;// 1为 + , -1为 - int num2 = 1; int o2 = 1;// 1为 * , -1为 / for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); //数字 if( Character.isDigit(ch) ) { int cur = 0; //出错: 防止数组越界错误 while (i < str.length() && Character.isDigit(str.charAt(i))) { //出错: 这里也要写成str.charAt(i), 因为i会移动 cur = cur*10 + str.charAt(i)-'0'; i++; } i--; num2 = o2 == 1 ? num2*cur : num2/cur; } // */ else if(ch=='*' || ch =='/') { o2 = ch=='*' ? 1 : -1; } // + - else if( ch=='+' || ch == '-' ) { char ch1 = str.charAt(i-1); //出错: - 前一个是左括号才是符号 if( ch=='-' && ( i==0 || ch1=='(' || ch1=='[' || ch1=='{' ))//负号的处理 { o1 = -1; continue; } num1 = num1+num2*o1; num2 = 1; o2 = 1; o1 = ch=='+'? 1:-1; } //左括号 else if(ch=='(' || ch=='[' || ch=='{' ) { stack.push(num1); stack.push(o1); stack.push(num2); stack.push(o2); //一切重新开始 num1= 0; o1 = 1;// 1为 + , -1为 - num2 = 1; o2 = 1;// 1为 * , -1为 / } else //右括号的处理 { int cur = num1 + num2*o1; o2 = stack.pop(); num2 = stack.pop(); o1 = stack.pop(); num1 = stack.pop(); //出错: 不仅num2更新, o2也要更新 num2 = o2==1? num2*cur : num2/cur; o2 = 1; } } System.out.println(num1+ num2*o1); } }