Python字符串S表达式求值程序


假设我们有一个字符串s作为S表达式。我们必须对该S表达式进行求值,并将结果作为整数返回。众所周知,s表达式是一个表达式,它可以是一个数字,也可以是一个用括号括起来的递归表达式,例如(+ (- 3 2) (* 3 3)),表示(3 - 2) + (3 * 3) = 10。这里有效的运算符是+、-、*和/。

因此,如果输入类似于s = "(- (+ 3 2) 2)",则输出将为3,因为((3 + 2) - 2) = 3。

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

  • stack := 新建一个栈

  • 移除s的开头和结尾括号

  • a := 使用空格分割s,并创建一个分区列表

  • 对于a中的每个i,按逆序执行:

    • 如果i的长度> 1,则:

      • 如果i[0]与"-"相同,则:

        • 将i作为整数压入栈

        • 进行下一次迭代

      • 否则:

        • 将i作为整数压入栈

    • 如果i是一个数字,则:

      • 将i作为整数压入栈

    • 否则:

      • 如果栈的大小>= 2,则:

        • num1 := 从栈中弹出

        • num2 := 从栈中弹出

        • 如果i与"+"相同,则:

          • 执行num1 + num2并将结果压入栈

        • 如果i与"-"相同,则:

          • 执行num1 - num2并将结果压入栈

        • 如果i与"*"相同,则:

          • 执行num1 * num2并将结果压入栈

        • 否则:

          • 执行num1 / num2并将结果压入栈

  • 返回栈顶元素,并移除栈顶元素

示例

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

在线演示

class Solution:
   def solve(self, s):
      stack = list()
      s = s.replace("(", "")
      s = s.replace(")", "")
      a = s.split()
      for i in a[::-1]:
         if len(i) > 1:
            if i[0] == "-":
               stack.append(int(i))
               continue
            else:
               stack.append(int(i))
         elif i.isdigit():
            stack.append(int(i))
         else:
            if len(stack) >= 2:
               num1 = stack.pop()
               num2 = stack.pop()
               if i == "+":
                  stack.append(int(num1 + num2))
               elif i == "-":
                  stack.append(int(num1 - num2))
               elif i == "*":
                  stack.append(int(num1 * num2))
               else:
                  stack.append(int(num1 / num2))
      return stack.pop()
ob = Solution()
s = "(- (+ 3 2) 2)"
print(ob.solve(s))

输入

s = "(- (+ 3 2) 2)"

输出

3

更新于:2020年12月22日

442 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告