题解 | #牛牛计算器#

牛牛计算器

https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace?tpId=354&tqId=10590517&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int calculate (String s) {
        // write code here
        Stack<Integer> stack = new Stack<Integer>();
        int num = 0;
        char operation = '+';
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (!Character.isWhitespace(c)) {

                if (c >= '0' && c <= '9') {
                    num = num * 10 + c - '0';
                } else if (c == '(') {
                    int j = i, cnt = 0;
                    for (; i < s.length(); i++) {
                        if (s.charAt(i) == '(')
                            cnt++;
                        if (s.charAt(i) == ')')
                            cnt--;
                        if (cnt == 0) {
                            break;
                        }
                    }
                    num = calculate(s.substring(j + 1, i));
                } else {
                    // 遇到符号了
                    if (operation == '+') {
                        stack.push(num);
                    } else if (operation == '-') {
                        stack.push(-num);
                    } else if (operation == '*') {
                        int tmp  = stack.pop() * num;
                        stack.push(tmp);
                    }
                    num = 0;
                    operation = c;
                }
                if (i == s.length() - 1) {
                    // 到达了计算的额字符串的末尾,将最后一个数字压入栈中
                    if (operation == '+') {
                        stack.push(num);
                    } else if (operation == '-') {
                        stack.push(-num);
                    } else if (operation == '*') {
                        int tmp  = stack.pop() * num;
                        stack.push(tmp);
                    }
                }
            } else {
                if (i == s.length() - 1) {
                    // 到达了计算的额字符串的末尾,将最后一个数字压入栈中
                    if (operation == '+') {
                        stack.push(num);
                    } else if (operation == '-') {
                        stack.push(-num);
                    } else if (operation == '*') {
                        int tmp  = stack.pop() * num;
                        stack.push(tmp);
                    }
                }
            }
        }
        int result = 0;
        while (!stack.isEmpty()) {
            result += stack.pop();
        }
        return result;
    }
    // " 3 - 2 * 4 "
    // -5
    // "(((((((((1+2)*3)+4)*5)+6)*7)+8)*9)+10)"
    //  4555
}

在表达式有效的前提下,计算字符串表达式的值

在刚开始取到的字符一定是数字或左括号之中的一种情况。

我们先讨论是数字的情况,如果开始的是数字字符,继续向后寻找,如果找到的还是数字,将前面的数字乘以10加上本次找到的数字,一直遇到数字就一直往下加拼凑,直到遇到符号或括号(说明本次数字找完整了),根据上一个遇到的符号把数字添加到栈中,

  • 如果上一个是加号,直接加入到栈中,
  • 如果上一个是减号,把其相反数放入栈中(旨在最后做出一个全是加法的表达),
  • 如果上一个是乘号,那么把栈顶元素弹出和本次相乘再加到栈中(旨在最后做出一个全是加法的表达)

最后把上一个操作符更新为本次的操作符,继续往下执行。

在末尾,处理栈中所有的元素,全部相加就是最后的结果

如果遇到的是括号,找到下一个成对的括号,然后把这段表达式放到函数中递归。

#java##栈##字符串匹配(正则表达式)#
全部评论

相关推荐

大摆哥:刚好要做个聊天软件,直接让你帮他干活了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 11:43
春招失败、父母离婚,好像我的人生一团糟,一年来压力大到常常崩溃。不知道能跟谁聊,朋友其实对我非常好,但是她无意中表达出来的家庭幸福都会刺痛到我……和ai聊天,我的未来在更高处,不在楼下,忍不住爆哭😭
youngfa:害,妹妹,我是一个研究生(很上进很想找到好工作的那种),但去年因为生病回家休养错过了秋招(当时对我的冲击也是非常大的),这学期返校来了也是把论文盲审交了后才开始找工作,现在也是一个offer没有,但我就没有像你一样把这个阶段性的事情绑定到人生上,人生不仅很长,也很广阔,先停下来,放松一下哦。不要被外部环境灌输的思维操控了,好好爱自己!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务