【发布时间】:2023-10-18 01:19:01
【问题描述】:
以下代码获取一个中缀字符串并将其转换为后缀并将新表达式作为字符串输出。但是它不支持负数或浮点数。以下代码仅允许单个数字值:
如 (0-9) 与 10 或 11 完全不同。否则会抛出 “key error”。此外,如果我添加一个负号,它也会引发一个关键错误。
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 isNumber(self, txt):
if not isinstance(txt,str) or len(txt.strip())==0:
print("Argument error in isNumber")
return False
# YOUR CODE STARTS HERE
try:
float(txt)
return True
except ValueError:
return False
#########################################################################################################
def infixToPostfix(infixexpr):
prec = {}
prec["^"] = 4
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec["("] = 1
opStack = Stack()
postfixList = []
tokenList = infixexpr.split()
for token in tokenList:
if token in "0123456789":
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 isNumber(x):
try:
float(x)
return True
except ValueError:
return False
并将这一行:if token in "0123456789": 改为:if Stack.isNumber(token):
现在代码允许浮动。
那么另一个问题是什么?另一个问题是我的代码假设输入字符串在每个字符之间只有一个空格,因此我 string.split() 将所有字符放入列表中。除了输入字符串在字符之间可以有任意数量的空格,如果没有空格,我的代码会将“((”)与我的字符列表进行比较,但找不到它并抛出 Key 错误。因此,由于我必须允许负数(用减号表示)。如何修改我的代码,使其不再抛出 keyerror 并允许我使用负数?
当我这样做时:
print(Stack.infixToPostfix("( ( 1 + 3 ) ) * 4 - ( 9.2 - 0 ) * ( 5 + 8 )"))
我的代码输出如下:
1 3 + 4 * 9.2 0 - 5 8 + * -
效果很好,但是如果我删除一个空格:
"(( 1 + 3 ) ) * 4 - ( 9.2 - 0 ) * ( 5 + 8 )"
我的代码不再有效。 Key error '(('我知道它为什么会抛出这个错误(上面的解释),但我不知道如何解决它。
所以最后一个问题 TL:DR
如何修改我的中缀后缀代码以允许字符之间有任意数量的空格并允许负数?
【问题讨论】:
-
所以你的代码会移动负号,即使它应该在转换后保持在数字前面,对吗? (假设中间有一个空格,否则会抛出该关键错误)。这很难,我建议重写你的整个代码。
-
@QuoraExpert 是的,它会移动负号。
-
它只需要解析文本(tokenize)。天真地分割空间是实现状态引擎的一个很好的起点,但它对输入数据施加了太多的限制。这是一个很好的编程,不过,一次只担心一项任务。
-
变量和函数名应该遵循
lower_case_with_underscores风格。
标签: python string list postfix-notation infix-notation