我试图完成我的程序,但遇到了一些我需要帮助的事情。我需要帮助尝试: 确保我的用户输入正确并进行错误测试。我会做些像......
if token == "" or token == " "
我不确定如何确保用户输入正确。
分配:
编写一个从中提取后缀表达式的程序(postfix.py) 用户并按照课程中的描述对其进行评估。你的程序应该 通过标准输入从用户提取表达式。该 表达式应格式化为至少有一个空格 每个运算符和操作数之间的空格。例如,
输入后缀表达式:
5 6 * 13 2 * +
假设所有运算符和操作数都有效。操作数应该是整数值 有效的运算符包括+ - / * %
提取表达式后,在字符串上使用
split()
方法 将其拆分为存储在Python列表中的单个令牌。 注意,多位操作数(即13
)被认为是单个操作数 令牌。后缀表达式应打印到标准输出,一个标记 在评估时,一次。另外,如果表达式是 有效,结果应打印在下一行后面 表达式如下图所示
5 6 * 13 2 * + = 56
如果表达式无效,请停止对表达式求值 确定有错误并打印3美元的标志。然后打印 下一行上的错误消息表示错误。例如, 如果遇到给定操作数的运算符太多, 你的程序应该产生如下所示的结果
Enter a postfix expression: 17 6 / + 8 * 17 6 / + $$$ Error: insufficient number of operands.
当给定操作数的运算符太少时,您的程序 应该产生如下所示的结果
Enter a postfix expression: 17 6 / 25 5 + 17 6 / 25 5 + $$$ Error: insufficient number of operators.
我的代码:
input("Enter a postfix expression: ")
operorList("*, /, -, +, %")
def postfixEval(postfixExpr):
operandStack = Stack()
tokenList = postfixExpr.split()
for token in tokenList:
if token in "0123456789":
operandStack.push(int(token))
else:
operand2 = operandStack.pop()
operand1 = operandStack.pop()
result = doMath(token,operand1,operand2)
operandStack.push(result)
return operandStack.pop()
def doMath(op, op1, op2):
if op == "*":
return op1 * op2
elif op == "/":
return op1 / op2
elif op == "+":
return op1 + op2
elif op == "%":
return op1 % op2
else:
return op1 - op2
答案 0 :(得分:0)
指派告诉
假设所有运算符和操作数都有效。操作数应为整数值,而有效运算符包括
+
-
/
*
%
因此可以假设没有其他输入,并且发生的唯一错误是堆栈上的操作数太多或不够,因此您只需要测试它们。
该行
if token in "0123456789":
仅检查整个令牌是0123456789
的子字符串,a.k.a是一个数字,01
,4567
左右。
您要做的是检查令牌是否全是数字:
if token.isdigit():
...
对于太少的操作数,pop
中的任何一个都可能抛出异常IndexError
;你会抓住它并报告错误:
try:
operand2 = operandStack.pop()
operand1 = operandStack.pop()
except IndexError:
# handle appropriately
同样,太多的操作数意味着operandStack
在最后有超过1个项目,所以只需检查len(operandStack)
;如果大于1则报告“操作数太多”。