题解 | #四则运算#

四则运算

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

import java.util.*;

// 注意类名必须为 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 exp = in.next();
            //括号替换
            String s = exp.replaceAll("\\[", "(");
            String s1 = s.replaceAll("\\{", "(");
            String s2 = s1.replaceAll("\\}", ")");
            String s3 = s2.replaceAll("\\]", ")");
            //System.out.println(s3);
            int length = s3.length();
            //操作数和运算符
            Stack<Character> op = new Stack<>();
            Stack<Integer> data = new Stack<>();
            for (int i = 0; i < length; i++) {
                char ch = s3.charAt(i);
                //操作数
                if (Character.isDigit(ch)) {
                    //提取数字
                    int index = i;
                    while (index != length-1 && Character.isDigit(s3.charAt(index))) {
                        index++;
                    }
                    String temp = "";
                    if (i != length - 1) {
                        temp = s3.substring(i, index);
                    } else {
                        temp = s3.substring(index, length);
                    }
                    int num = Integer.parseInt(temp);
                    data.push(num);
                    //下标跳转
                    if (i != length - 1) {
                        i = index - 1;
                    }
                    continue;
                }
                //运算符
                if (op.isEmpty() || ch == '(') {
                    //如果是正负号,在前面加一个0
                    if (ch == '+' || ch == '-') {
                        if (i - 1 < 0 || s3.charAt(i - 1) == '(') {
                            data.push(0);
                        }
                    }
                    //符号入栈
                    op.push(ch);
                } else if (ch == ')') {
                    //进行计算
                    while (op.peek() != '(') {
                        compute(op, data);
                    }
                    //左括号出栈
                    char wasted = op.pop();
                } else if (ch == '+' || ch == '-') {
                    //检查优先级:真不为空且栈顶元素不为左括号,一直进行出栈运算
                    while (!op.isEmpty() && op.peek() != '(') {
                        compute(op, data);
                    }
                    //正负号前加0
                    if (i - 1 < 0 || s3.charAt(i - 1) == '(') {
                        data.push(0);
                    }
                    op.push(ch);
                } else if (ch == '*' || ch == '/') {
                    //优先级检查
                    while (!op.isEmpty() &&op.peek() != '('&& op.peek() != '+' && op.peek() != '-') {
                        compute(op, data);
                    }
                    op.push(ch);
                }
            }
            //继续计算
            while (!op.isEmpty()) {
                compute(op, data);
            }
            System.out.print(data.pop());
        }
    }
    public static void compute(Stack<Character> op, Stack<Integer> data) {
        char operator=op.pop();
        int right=data.pop();
        int left=data.pop();
        //结果
        int res=-1;
        if(operator=='+'){
            res=left+right;
        }else if(operator=='-'){
            res=left-right;
        }else if(operator=='*'){
            res=left*right;
        }else{
            res=res=left/right;
        }
        data.push(res);
    }
}

全部评论

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
在打卡的大老虎很想潜...:你在找实习,没啥实习经历,技术栈放前面,项目多就分两页写,太紧凑了,项目你最多写两个,讲清楚就行,项目背景。用到的技术栈、亮点、难点如何解决,人工智能进面太难了,需求少。你可以加最新大模型的东西
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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