返回

LeetCode 227 题⭐:用 Python 巧解基本计算器 II

前端

算法思想

LeetCode 227 题的基本思想是使用栈来存储运算符和操作数。我们首先将表达式中的数字和运算符分离出来,然后将数字压入栈中,将运算符也压入栈中。当遇到右括号时,我们将栈顶的两个数字弹出,并根据栈顶的运算符进行计算,将计算结果压入栈中。重复这个过程,直到栈中只剩下一个数字,这个数字就是表达式的值。

Python 实现

def calculate(s):
  """
  计算一个给定字符串表达式的值。

  参数:
    s: 一个字符串表达式。

  返回:
    表达式的值。
  """

  # 将表达式中的数字和运算符分离出来。
  tokens = []
  i = 0
  while i < len(s):
    if s[i].isdigit():
      # 如果是数字,则将它压入栈中。
      number = 0
      while i < len(s) and s[i].isdigit():
        number = number * 10 + int(s[i])
        i += 1
      tokens.append(number)
    elif s[i] in "+-*/":
      # 如果是运算符,则将它压入栈中。
      tokens.append(s[i])
      i += 1
    else:
      # 如果是其他字符,则跳过它。
      i += 1

  # 创建一个栈来存储运算符和操作数。
  stack = []

  # 遍历令牌。
  for token in tokens:
    # 如果是数字,则将它压入栈中。
    if isinstance(token, int):
      stack.append(token)
    # 如果是运算符,则将栈顶的两个数字弹出,并根据运算符进行计算,将计算结果压入栈中。
    else:
      num2 = stack.pop()
      num1 = stack.pop()
      if token == "+":
        result = num1 + num2
      elif token == "-":
        result = num1 - num2
      elif token == "*":
        result = num1 * num2
      else:
        result = int(num1 / num2)
      stack.append(result)

  # 栈中只剩下一个数字,这个数字就是表达式的值。
  return stack[0]

复杂度分析

  • 时间复杂度:O(n),其中 n 是表达式中的字符数。
  • 空间复杂度:O(n),其中 n 是表达式中的字符数。

结语

LeetCode 227 题是一个经典的基础计算器问题,它要求我们计算一个给定字符串表达式的值。这个问题可以用 Python 的栈数据结构来解决。这篇文章详细介绍了如何使用 Python 来解决 LeetCode 227 题,并提供了清晰易懂的代码示例。希望这篇文章对您有所帮助。