在Python中将s表达式作为字符串进行评估的程序
假设我们有一个字符串s作为S表达式。我们必须评估该S表达式并将结果作为整数返回。由于我们知道S表达式是一个表达式,它是一个数字或一个递归表达式(如(+(-3 2)(3 3)),其中表示(3-2)+(33)=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,并将其推入堆栈
- 如果i的大小>1,则
- 返回堆栈顶部元素,并删除顶部元素
示例
让我们看下面的实现,以更好地理解−
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