Suppose we have a string s as S-expression. We have to evaluate that S-expression and return result as integer. As we know that the s-expression is an expression which is either one number, or a recursive expression wrapped in parentheses like (+ (- 3 2) (* 3 3)), which indicates (3 - 2) + (3 * 3) = 10. Here valid operators are +, -, *, and /.
So, if the input is like s = "(- (+ 3 2) 2)", then the output will be 3, as ((3 + 2) - 2) = 3.
To solve this, we will follow these steps −
stack := a new stack
remove the opening and closing parenthesis of s
a := split s using spaces and make a list of partitions
for each i in a in reverse order, do
if size of i > 1, then
if i[0] is same as "-", then
push i as integer into stack
go for next iteration
otherwise,
push i as integer into stack
otherwise when i is a digit, then
push i as integer into stack
otherwise,
if size of stack >= 2, then
num1 := pop from stack
num2 := pop from stack
if i is same as "+", then
perform num1 + num2 and push into stack
otherwise when i is same as "-", then
perform num1 - num2 and push into stack
otherwise when i is same as "*", then
perform num1 * num2 and push into stack
otherwise,
perform num1 / num2 and push into stack
return top element from stack, and remove top element
Example
Let us see the following implementation to get a better understanding −
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))Input
s = "(- (+ 3 2) 2)"
Output
3