题解 | #表达式求值#同样抄大佬代码,与四则运算极其类似,一套解决!注释同样的详尽!

表达式求值

http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

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;
    }
}
全部评论
这是简单题?
1 回复 分享
发布于 2022-03-20 10:23
则是简单题?
1 回复 分享
发布于 2022-04-08 06:26
这题居然是简单
6 回复 分享
发布于 2022-02-11 14:26
这题我感觉挺难啊
6 回复 分享
发布于 2022-03-03 20:44
考试中途可以换语言吗?转python用eval(),一行解决
2 回复 分享
发布于 2022-06-23 01:13
第55行不对吧 number是减号之前的数 应该给减号之后的数字取反
1 回复 分享
发布于 2022-05-26 18:23
楼主,要是第一个就是负数,你这代码不对了
点赞 回复 分享
发布于 2022-03-22 18:49
//当前字符是数字,拼数字 if(Character.isDigit(ch)){ number=number*10+ch-'0'; } 为啥后面要 -'0' 啊
点赞 回复 分享
发布于 2022-05-14 20:00
别 这道题的解决方法完全根据题目要求的表达式要求的,如果第一个运算符是-号,那么就要把sign初始化为-号 没啥意思嗷。当然写对就行,
点赞 回复 分享
发布于 2022-07-21 23:07
最后一个数字去哪了?
点赞 回复 分享
发布于 2022-08-08 18:04
index没有用上
点赞 回复 分享
发布于 2022-08-19 15:34 北京
看完这篇解醍醐灌顶,谢谢好兄弟分享
点赞 回复 分享
发布于 2022-10-15 15:53 广东
这真的是简单题吗?我丢
点赞 回复 分享
发布于 2023-03-14 09:39 北京
不是,题目的合法只有“+,-,*,/,(,),0-9”,没有“{,},[,]”。这样输入的表达式就是很简单的
点赞 回复 分享
发布于 2023-03-28 11:17 广东
为什么,字符是数字,就拼数字呢
点赞 回复 分享
发布于 2023-04-06 10:36 广东
1/-3 这个无法处理
点赞 回复 分享
发布于 2023-04-10 20:50 湖北
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.util.Scanner; public class Main { public static void main(String[] args) throws ScriptException { Scanner scanner = new Scanner(System.in); String express = scanner.nextLine(); ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript"); express = express.replace("{", "("); express = express.replace('}', ')'); express = express.replace('[', '('); express = express.replace(']', ')'); System.out.println(scriptEngine.eval(express)); } } 这个可以处理1/-3这种特殊场景的,但是你这个算法无法处理这种特殊场景的
点赞 回复 分享
发布于 2023-04-10 20:53 湖北
-1*(-1*-1) 这个表达式运算是通不过的
点赞 回复 分享
发布于 2023-05-10 15:37 广东
你这index完全没用上,复制的有些仓促了,思路整理的不错
点赞 回复 分享
发布于 2023-05-20 16:46 浙江

相关推荐

28小凳也想实习:项目不用一个业务一个轮子吗,刷牛客好多人说要一业务一轮子
点赞 评论 收藏
分享
评论
64
23
分享

创作者周榜

更多
牛客网
牛客企业服务