题解 | #牛牛计算器#

牛牛计算器

https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace

  • 题目考察的知识点 : 栈的使用
  • 题目解答方法的文字分析:
  1. 使用栈来实现该计算器。对于每个括号内的表达式,可以使用递归的方法计算。具体来说,可以使用一个栈 nums 记录当前位置之前的所有数字,同时还需要使用一个栈 ops 记录上一个操作符。遍历字符串 s,对于每个字符 c,进行如下操作:
  2. 如果 c 是数字,则将其转化为整数并加入栈 nums 的栈顶元素。
  3. 如果 c 是左括号,则找到与之匹配的右括号,并对其进行递归计算。
  4. 如果 c 是操作符,则直接将其加入栈 ops 的栈顶元素。
  5. 如果 c 是空格或者已经到达字符串末尾,则说明当前数字和操作符的读取已经结束,根据上一个操作符进行相应的计算并将结果加入栈 nums 的栈顶元素。
  6. 最终将栈 nums 中所有数字依次弹出并累加得到结果。
  • 本题解析所用的编程语言: Python
  • 完整且正确的编程代码

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串
# @return int整型
#
class Solution:
    def calculate(self, s: str) -> int:
        nums, ops = [], []
        num, pre_op = 0, '+'
        i, n = 0, len(s)

        while i < n:
            c = s[i]

            if c.isdigit():
                num = num * 10 + int(c)

            elif c == '(':
                j, cnt = i, 0
                for i in range(i, n):
                    if s[i] == '(':
                        cnt += 1
                    if s[i] == ')':
                        cnt -= 1
                    if cnt == 0:
                        break
                num = self.calculate(s[j+1:i])

            if not c.isspace() or i == n-1:
                if pre_op == '+':
                    nums.append(num)
                elif pre_op == '-':
                    nums.append(-num)
                elif pre_op == '*':
                    nums[-1] *= num
                num = 0
                pre_op = c

            i += 1

        return sum(nums)
牛客高频top202题解系列 文章被收录于专栏

记录刷牛客高频202题的解法思路

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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