所以我需要修改以下代码,以便方法PostfixEval()
和infixToPostfix()
可以使用浮点数,以及具有多个数字的整数。我试过了isinstance(token,float) == True
。也许我没有正确使用它。
def infixToPostfix(infixexpr):
prec = {}
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec["("] = 1
opStack = Stack()
postfixList = []
tokenList = infixexpr.split()
for token in tokenList:
if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or isinstance(token,int) == True :
postfixList.append(token)
elif token == '(':
opStack.push(token)
elif token == ')':
topToken = opStack.pop()
while topToken != '(':
postfixList.append(topToken)
topToken = opStack.pop()
else:
while (not opStack.isEmpty()) and \
(prec[opStack.peek()] >= prec[token]):
postfixList.append(opStack.pop())
opStack.push(token)
while not opStack.isEmpty():
postfixList.append(opStack.pop())
return " ".join(postfixList)
和
def postfixEval(postfixExpr): # also fix this to do floats
operandStack = Stack()
tokenList = postfixExpr.split()
for token in tokenList:
if isinstance(token,int) == True:
operandStack.push(int(token))
else:
operand2 = operandStack.pop()
operand1 = operandStack.pop()
result = doMath(token,operand1,operand2)
operandStack.push(result)
return operandStack.pop()
答案 0 :(得分:2)
tokenList = infixexpr.split()
创建一个字符串列表,其中没有一个可以是浮点数。你可以创建一个函数来强制转换为float,如果你可以强制转换为浮动。
def is_float(s):
try:
float(s)
return True
except ValueError:
return False
然后:
lett_set = set("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
if token in lett_set or isfloat(token)
您也可以返回浮动并在其他函数中使用它:
def is_float(s):
try:
return float(s)
except ValueError:
return None
for token in tokenList:
test = is_float(token)
if test is not None: # catch potential 0
operandStack.push(test)
您可以在两个功能中使用第二个版本。你在标题中提到了浮点数,所以我认为你可以使用浮点数而不能尝试转换为int。
在旁注isinstance(token,int) == True
等..可以简单地写成isinstance(token,int)
,这将是真或假,因此任何if isinstance(token,int)
都将被正确评估