题解 | #四则运算#
四则运算
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);
}
}

