题解 | #表达式求值#

表达式求值

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

import java.util.*;
import java.util.regex.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        map.put(')', 0);
        map.put('(', 0);
        map.put('*', 2);
        map.put('/', 2);
        map.put('+', 1);
        map.put('-', 1);
        map.put('#', 1);
        Pattern p = Pattern.compile("[0-9]");
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String str = in.nextLine()
                    .replaceAll("\\[", "(")
                    .replaceAll("]", ")")
                    .replaceAll("\\{", "(")
                    .replaceAll("}", ")");
             Stack<String> numStack = new Stack<String>();
            Stack<Character> symbolStack = new Stack<Character>();
            char[] chars = str.toCharArray();
            for (int i = 0; i < chars.length; i++) { 
                char c = chars[i];
                if ((c == '-' && i == 0) ||
                    (c == '-' && ((chars[i - 1] < '0' || chars[i - 1] > '9') && chars[i-1]!=')'))
                    ) { //处理负号,要注意下标顺序,先判断边界值,在判断前面的字符
                    c = '#';
                }
                if (c >= '0' && c <= '9') { //处理数字
                    StringBuilder sb = new StringBuilder(String.valueOf(c));
                    for(int j=i+1; j<chars.length;j++) { //处理两位数以上
                        if(chars[j]>='0' && chars[j] <= '9') {
                            sb.append(chars[j]);
                            i=j;
                        } else {
                            break;
                        }
                    }
                    numStack.push(sb.toString());
                } else if (c == '(') { //"(" 直接入栈
                    symbolStack.push(c);
                } else if (c != ')') { // 非")"的符号
                    if (symbolStack.isEmpty()) { //符号栈空直接入栈
                        symbolStack.push(c);
                    } else { 
                        while (!symbolStack.isEmpty()) {
                            if (map.get(c) > map.get(symbolStack.peek())) { //判断优先级
                                symbolStack.push(c);
                                break;
                            } else {
                                numStack.push(String.valueOf(symbolStack.peek()));
                                symbolStack.pop();
                            }
                        }
                        if(symbolStack.isEmpty()) { //优先级判断完成后栈空,入栈
                            symbolStack.push(c);
                        }
                    }
                } else if (c == ')') { //遇到 "(" ,符号栈依次出栈,直到"(" 出栈
                    while (!symbolStack.isEmpty()) {
                        if (symbolStack.peek() == '(') {
                            symbolStack.pop();
                            break;
                        } else {
                            numStack.push(String.valueOf(symbolStack.peek()));
                            symbolStack.pop();
                        }
                    }
                }
            }
            while (!symbolStack.isEmpty()) { //将剩余的符号按次序出栈
                numStack.push(String.valueOf(symbolStack.peek()));
                symbolStack.pop();
            }
            int length = numStack.size();
            Stack<String> currStack = new Stack<String>();
            for(int i=0;i<length;i++) { //反转后缀表达式栈
                currStack.push(numStack.peek());
                numStack.pop();
            }
            numStack.clear();
            double sum = 0;
            Stack<Double> sumStack = new Stack<Double>();
            for (int i = 0; i < length; i++) {
                String c = currStack.peek();
                if (p.matcher(c).find()) { //数字直接入结果栈
                    sumStack.add(Double.parseDouble(c));
                } else if (c.equals("#")) { //符号反转结果栈顶数字
                    sum = -sumStack.peek();
                    sumStack.pop();
                    sumStack.add(sum);
                } else { //其他运算符拿 栈顶下一个数字 - 栈顶数字 得到新栈顶数字在入栈
                    double b = sumStack.peek();
                    sumStack.pop();
                    double a = sumStack.peek();
                    sumStack.pop();
                    switch(c) {
                        case "+":
                            sum = a+b;
                            break;
                        case "-":
                            sum = a-b;
                            break;
                        case "*":
                            sum = a*b;
                            break;
                        case "/":
                            sum = a/b;
                            break;
                    }
                    sumStack.add(sum);
                }
                currStack.pop(); //操作每一步后后缀表达式栈要弹出栈顶元素
            }
            System.out.println((int)sum);
        }
    }
}

全部评论

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
07-02 13:52
武汉大学 golang
骗你的不露头也秒
牛客87776816...:😃查看图片
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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