题解 | #表达式求值#抄大佬代码,将所有的其他括号,换成小括号,递归,注释详尽!

四则运算

http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
      //将其他括号,替换成小括号
        s=s.replace("{","(");
        s=s.replace("[","(");
        s=s.replace("}",")");
        s=s.replace("]",")");
        System.out.println(slove(s));
    }
    public static int slove(String s){
        Stack<Integer> stack=new Stack<>();
        int n=s.length();
        char[] chs=s.toCharArray();
        int index=0;
      //初始化符号为'+'
        char sign='+';
      //记录数字
        int number=0;
        for(int i=0;i<n;i++){
            char ch=chs[i];
            //当前字符是空格,跳过
            if(ch==' ')continue;
            //当前字符是数字,拼数字
            if(Character.isDigit(ch)){
                number=number*10+ch-'0';
            }
            //如果当前字符是小括号
            if(ch=='('){
              //移到小括号后一位字符
                int j=i+1;
                //统计括号的数量
                int count=1;
                while(count>0){
                  //遇到右括号,括号数-1
                    if(chs[j]==')')count--;
                  //遇到左括号,括号数+1
                    if(chs[j]=='(')count++;
                    j++;
                }
              //递归,解小括号中的表达式
                number=slove(s.substring(i+1,j-1));
                i=j-1;
            }
          //遇到符号,将数字处理后放进栈
            if(!Character.isDigit(ch) || i==n-1){
              //如果是'+',直接入栈
                if(sign=='+'){
                    stack.push(number);
                }
              //如果是'-',数字取相反数在入栈
                else if(sign=='-'){
                    stack.push(-1*number);
                }
              //如果是'*',弹出一个数字乘后放入栈
                else if(sign=='*'){
                    stack.push(stack.pop()*number);
                }
              //如果是'/',弹出一个数字/后放入栈
                else if(sign=='/'){
                    stack.push(stack.pop()/number);
                }
              //更新符号
                sign=ch;
              //刷新数字
                number=0;
            }
        }
      //栈中数字求和得到结果
        int ans=0;
        while(!stack.isEmpty()){
            ans+=stack.pop();
        }
        return ans;
    }
}
全部评论
+10 +123 +1000 加上大于9的数字的时候,需要循环乘以10处理
1 回复 分享
发布于 2023-03-11 18:36 广东
棒棒哒
点赞 回复 分享
发布于 2022-06-20 10:16
number=number*10+ch-'0';中number*10什么含义有大佬指点吗
点赞 回复 分享
发布于 2022-07-03 00:34
不需要考虑下类似 3*-1 这类的算式吗
点赞 回复 分享
发布于 2023-03-17 11:07 四川
48行为啥要考虑 i==n-1呀
点赞 回复 分享
发布于 2023-08-28 20:25 江苏

相关推荐

头像
11-10 15:56
东北大学 Java
帆软的感谢信真是又臭又长
等待offer降临的ylq:而且他内部是真的好,实习无转正有感而发
投递帆软软件等公司10个岗位 > 你都收到了哪些公司的感谢信?
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
47 19 评论
分享
牛客网
牛客企业服务