题解 | #表达式求值#

表达式求值

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

import java.util.Scanner;
import java.lang.StringBuilder;
import java.util.Stack;
import java.lang.Math;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String input = in.nextLine();
            int length = input.length();
            Stack<Character> operator = new Stack<>(); //运算符栈
            Stack<Integer> number = new Stack<>(); //操作数栈
            for (int i = 0; i < length; i++) {
                char temp = input.charAt(i);
                if (temp == '(') { //左括号直接入栈
                    operator.push(temp);
                } else if (temp == ')') {
                    while (operator.peek() != '(' && !operator.empty()) { //右括号出栈栈顶运算符,直至遇到左括号为止
                        int num1 = number.pop();
                        int num2 = number.pop();
                        int result = arithmetic(num1, num2, operator.pop());
                        number.push(result);
                    }
                    operator.pop();
                } else if (temp == '+' || temp == '-') {//加减号只有遇到左括号或者栈空入栈,栈顶为其余运算符时均出栈
                    if (operator.empty()) {
                        operator.push(temp);
                    } else if (!operator.empty() && (operator.peek() == '(')) {
                        operator.push(temp);
                    } else {
                        while(!operator.empty()&&(operator.peek() == '*'||operator.peek() == '/'||operator.peek() == '+'||operator.peek() == '-')){
                            int num1 = number.pop();
                            int num2 = number.pop();
                            int result = arithmetic(num1,num2,operator.pop());
                            number.push(result);
                        }
                        operator.push(temp);
                    }
                } else if (temp == '*' || temp == '/') {//乘除号遇到加减号,左括号,栈空时入栈,遇到乘除号时出栈栈顶元素
                    if (operator.empty()) {
                        operator.push(temp);
                    } else if (!operator.empty() && ( operator.peek() == '(' || operator.peek() == '+' || operator.peek() == '-')) {
                        operator.push(temp);
                    } else{
                        while(!operator.empty()&&(operator.peek() == '*'||operator.peek() == '/')){
                            int num1 = number.pop();
                            int num2 = number.pop();
                            int result = arithmetic(num1,num2,operator.pop());
                            number.push(result);
                        }
                        operator.push(temp);                        
                    }
                } else if(Character.isDigit(temp)){
                        StringBuilder sb = new StringBuilder();
                        boolean isNegative = false;//判断是否是负数
                        if(i-1 == 0&&input.charAt(i-1) == '-'){ 
                            isNegative = true;
                            operator.pop();
                        }else if(i-1 > 0 && i-2 > 0&&input.charAt(i-1) == '-'&&input.charAt(i-2) == '('){
                            isNegative = true;
                            operator.pop();                           
                        }
                        while(Character.isDigit(input.charAt(i))){//合并数字
                            sb.append(input.charAt(i));
                            if(i < length - 1 && Character.isDigit(input.charAt(i+1))){
                                i++;
                            }else{
                                break;
                            }
                        }
                        Integer tempNumber = Integer.valueOf(sb.toString());
                        //System.out.println(tempNumber);
                        if(isNegative == true){
                            tempNumber = -tempNumber;
                            isNegative = false;
                        }
                        number.push(tempNumber);                         
                }
            }
            while(!operator.empty()){ //所有字符都经过入栈操作后将运算符栈全都出栈
                int num1 = number.pop();
                int num2 = number.pop();
                char op = operator.pop();
                int result = arithmetic(num1,num2,op);
                number.push(result);
            }
            System.out.println(number.pop());
            return;
        }
    }
    public static int arithmetic(int n1,int n2,char op){
        switch(op){
            case '+':
            return n2+n1;
            case '-':
            return n2-n1;
            case '*':
            return n2*n1;
            case '/':
            return n2/n1;
        }
        return 0;
    }
}

全部评论

相关推荐

02-12 20:22
重庆大学 Java
字节暑期刚入职四天,因为是年前,所以很多正职都放假走了,也就没有给我分配mt,然后有一个老哥在我来的时候给我发了一个landing手册,然后还有关于部门业务的白皮书,还有一些业务代码。然后本人是java面的,进来第一次接触go语言&nbsp;前面几天熟悉了一下go的语法和go的框架,可以读但是还不太会写,然后业务白皮书也看的很头疼,包括landing手册里要了解的很多东西说实话我看文档真的快看死了,一个嵌套一个,问题是我还完全不知道咋用这个我了解的东西,还有就是那个项目代码,那个老哥喊我去写写单测,熟悉一下go的语法,但也进行的很困难(这是我第一段实习,之前都是springboot那一套,真不太熟悉这个)想问问大家的建议,就是我从现在开始到在开年回来之前应该做些什么,我目前就一个想法&nbsp;就是复现一个landing手册上的go框架小项目&nbsp;就是相当于帮自己锻炼锻炼怎么写go&nbsp;或者各位大佬有没有更好的锻炼go语法的建议还有就是大家都在说vibe&nbsp;coding,那我应该怎么锻炼自己使用ai的能力,感觉我除了给一些需求然后它给我生成代码,好像就没别的用法了,那些什么工作流、拆解、skill啥的都不知道从哪一个地方开始,包括我现在正在实习,不知道精力该怎么分配,去网上想找找关于agent开发的一些学习流程,说实话,众说纷纭,有的是从python开始打基础然后系统学那些rag&nbsp;prompt&nbsp;langchain&nbsp;mcp等等,有的是说直接找一个github上的ai项目然后反复问ai,我确实有点迷茫,恳求各位大佬能留下你们宝贵的建议,我一定认真反复深刻学习有一说一&nbsp;我觉得字节饭挺好吃的!
双非后端失败第N人:1. go语言我建议你让ai带着你先把基本语法速通了,然后再去用go重新刷你以前刷过的leetcode,这样熟悉起来很快 2. 直接看你们组go项目,里面用***比较复杂,然后把每一个语法现象都喂给ai,一点点看
字节跳动公司福利 1371人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务