注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性。
本文阅读时间约为5分钟。
栈的编程练习题3:后缀表达式求值
根据后缀表达式表示法,求表达式的值。
有效的运算符包括 +, -, *, / ;其中除法仅保留整数结果。
若出现除数为0或表达式非法的情况,输出"NaN"。
注:
每个数字token可包含多位,也可为负数。
除法统一使用 int(a / b) 而非 a // b 进行计算。
输入格式:
一行字符串,每个token间以空格分隔
输出格式:
一行,包含一个整数或"NaN"
输入样例:
"4 13 5 / +"
输出样例:
6
示例代码模板:
def calc(tokens): ### code here print(calc(input().split()))
解答:分析详见Python数据结构与算法09:基本结构:栈的应用之表达式求值。
参考代码如下:
class Stack: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[len(self.items)-1] def size(self): return len(self.items)def calc(tokens): operandStack = Stack() l1 = [] l2 = [] for token in tokens: if token not in "+-*/" and type(eval(token)) == int: #操作数。 l1.append(token) operandStack.push(int(token)) elif token in "+-*/": l2.append(token) try: operand2 = operandStack.pop() operand1 = operandStack.pop() result = doMath(token, operand1, operand2) operandStack.push(result) except: return "NaN" else: return "NaN" if len(l1) != len(l2) + 1: return "NaN" else: return operandStack.pop()def doMath(op, op1, op2): try: if op == "*": return op1 * op2 elif op == "/": return int(op1 / op2) elif op == "+": return op1 + op2 else: return op1 - op2 except: return "NaN"print(calc(input().split()))
To be continued.