Python程序:无需内置函数计算数学表达式


假设我们有一个字符串,它表示一个包含 (+, -, *, /) 的数学表达式。这里 / 表示整数除法,我们需要计算并返回结果,而无需使用任何内置函数。

例如,如果输入为 s = "2+3*5/7",则输出为 4,因为 2 + ((3 * 5) / 7) = 4

为了解决这个问题,我们将遵循以下步骤:

  • s := 反转给定的字符串
  • 定义一个函数 get_value()。
  • sign := 1
  • 如果 s 不为空且 s 的最后一个元素与 "-" 相同,则
    • 从 s 中删除最后一个元素
    • sign := -1
  • value := 0
  • 当 s 不为空且 s 的最后一个元素是数字时,执行以下操作:
    • value := value * 10
    • value := value + s 中最后一个元素的数值,并删除 s 的最后一个元素
  • 返回 sign * value
  • 定义一个函数 get_term()
  • term := get_value()
  • 当 s 不为空且 s 的最后一个元素是 * 或 / 时,执行以下操作:
    • op := s 的最后一个元素,并从 s 中删除最后一个元素
    • value := get_value()
    • 如果 op 与 "*" 相同,则
      • term := term * value
    • 否则,
      • term := (1.0 * term / value) 的向下取整
  • 返回 term
  • 在主方法中执行以下操作:
  • ans := get_term()
  • 当 s 不为空时,执行以下操作:
    • op := s 的最后一个元素,并从 s 中删除它
    • term := get_term()
    • 如果 op 与 "+" 相同,则
      • ans := ans + term
    • 否则,
      • ans := ans - term
  • 返回 ans

让我们来看下面的实现,以更好地理解:

示例

在线演示

from math import floor, trunc
class Solution:
   def solve(self, s):
      s = list(s[::-1])

      def get_value():
         sign = 1
         if s and s[-1] == "-":
            s.pop()
            sign = -1
         value = 0
         while s and s[-1].isdigit():
            value *= 10
            value += int(s.pop())
         return sign * value

      def get_term():
         term = get_value()
         while s and s[-1] in "*/":
            op = s.pop()
            value = get_value()
            if op == "*":
               term *= value
            else:
               term = floor(1.0 * term / value)
         return term

      ans = get_term()
      while s:
         op, term = s.pop(), get_term()
         if op == "+":
            ans += term
         else:
            ans -= term
      return ans

ob = Solution()
s = "2+3*5/7"
print(ob.solve(s))

输入

"2+3*5/7"

输出

4

更新于: 2020-12-03

2K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告