题解 | #四则运算#

四则运算

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);
    }
}
















全部评论

相关推荐

拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务