leetcode_227. 基本计算器 II

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

输入:s = " 3+5 / 2 "
输出:5

提示:

1 <= s.length <= 3 * 10^5
s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 2^31 - 1] 内
题目数据保证答案是一个 32-bit 整数

二、解题思路

和leetcode_224. 基本计算器想法类似,用栈去存,只不过这次栈里只存两个数直接的计算结果,注意Python中除法在负数处理时的问题。

三、代码

class Solution:
    def calculate(self, s: str) -> int:
        stack = []
        res = 0
        flag = '+'
        cur_num = 0
        i = 0
        while i < len(s):
            if ord(s[i]) >= ord('0'):
                cur_num = cur_num * 10 + ord(s[i]) - ord('0')
            if (ord(s[i]) < ord('0') and s[i] != ' ') or i == len(s) - 1:
                if flag == '+':
                    stack.append(cur_num)
                elif flag == '-':
                    stack.append(-cur_num)
                elif flag == '*':
                    stack.append(stack.pop() * cur_num)
                elif flag == '/':
                    if stack[-1] % cur_num == 0:
                        stack.append(stack.pop() // cur_num)
                    else:
                        stack.append(stack.pop() // cur_num if stack[-1] >= 0 else stack.pop() // cur_num + 1)
                flag = s[i]
                cur_num = 0
            i += 1

        while len(stack) != 0:
            res += stack.pop()
        return res




if __name__ == '__main__':
    ss = Solution()
    # s = " 3+5 / 2 "
    # s = "14-3/2"
    s = "10000-1000/10+100*1"
    ans = ss.calculate(s)
    print(ans)

你可能感兴趣的:(leetcode,Python,leetcode,栈,python,字符串)