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

四则运算

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 广东
48行为啥要考虑 i==n-1呀
点赞 回复 分享
发布于 2023-08-28 20:25 江苏
不需要考虑下类似 3*-1 这类的算式吗
点赞 回复 分享
发布于 2023-03-17 11:07 四川
number=number*10+ch-'0';中number*10什么含义有大佬指点吗
点赞 回复 分享
发布于 2022-07-03 00:34
棒棒哒
点赞 回复 分享
发布于 2022-06-20 10:16

相关推荐

想去毕业旅行的斑马在...:学校不是92的话,没有实习经历投不了大厂,去投中小厂,拿点实习经历
点赞 评论 收藏
分享
评论
52
19
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8880次浏览 81人参与
# 你的实习产出是真实的还是包装的? #
1654次浏览 40人参与
# 巨人网络春招 #
11289次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7346次浏览 40人参与
# 重来一次,我还会选择这个专业吗 #
433273次浏览 3926人参与
# 简历第一个项目做什么 #
31477次浏览 324人参与
# MiniMax求职进展汇总 #
23690次浏览 305人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186831次浏览 1118人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152247次浏览 887人参与
# 研究所笔面经互助 #
118840次浏览 577人参与
# 简历中的项目经历要怎么写? #
309917次浏览 4184人参与
# 面试紧张时你会有什么表现? #
30468次浏览 188人参与
# 你今年的平均薪资是多少? #
212961次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63273次浏览 795人参与
# 我的求职精神状态 #
447946次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76397次浏览 374人参与
# 高学历就一定能找到好工作吗? #
64281次浏览 620人参与
# 牛客AI文生图 #
21398次浏览 238人参与
# 你怎么看待AI面试 #
179756次浏览 1224人参与
# 正在春招的你,也参与了去年秋招吗? #
363136次浏览 2635人参与
# 腾讯音乐求职进展汇总 #
160544次浏览 1109人参与
# 职能管理面试记录 #
10789次浏览 59人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务