在 Python 中使用堆栈评估中缀表达式:我找不到我的错误
Posted
技术标签:
【中文标题】在 Python 中使用堆栈评估中缀表达式:我找不到我的错误【英文标题】:Evaluating Infix Expressions Using Stacks in Python: I cant find my error 【发布时间】:2014-04-14 11:01:35 【问题描述】:在查看此代码 2 天后,我决定寻求帮助。这是我第一次提出问题,所以请多多包涵。
我的编码经验很少,我的知识就显示的代码而言,尽量保持简单。
对于我正在学习的课程,我必须编写代码才能正确执行操作顺序,这是我完成的代码:
import operator
class stack:
def __init__(self):
self._stack = []
def __len__(self):
return len(self._stack)
def is_empty(self):
return len(self._stack) == 0
def push(self, e):
self._stack.append(e)
def top(self):
if self.is_empty():
print ('stack is empty')
return self._stack[-1]
def pop(self):
if self.is_empty():
print ('stack is empty')
return
return self._stack.pop()
def apply(a,b,c):
ops2 = "+": operator.add,
"-": operator.sub,
"*": operator.mul,
"/": operator.truediv
op_char = c
op_func = ops2[op_char]
result = op_func(float(a), float(b))
return result
user = '6 - 5 ( 5 - 3 ) * (4 + 2 )'
#user = input("Enter an expression: ")
print(user)
exp = user.split()
nums = '1234567890'
ops = ['*', '/', '+', '-']
par = ['(', ')']
num = stack()
op = stack()
for each in exp:
print(each)
if each in nums:
num.push(each)
if each == par[0]:
op.push(each)
if each in ops:
if each == ops[2] or ops[3]:
op.push(each)
if each == ops[0] or ops[1]:
while op.top() == (ops[2] or ops[3]) and len(op) > 0 and len(num) >= 2:
ans = apply(num.pop(),num.pop(),op.pop())
num.push(ans)
op.push(each)
if each == par[1]:
while op.top() != "(":
ans = apply(num.pop(),num.pop(),op.pop()) # this line is poping the empty stack
num.push(ans)
op.pop()
while op.is_empty() != True:
ans = apply(num.pop(),num.pop(),op.pop())
num.push(ans)
print(ans)
至少我是这么想的...
当我运行这个时,我从if each == par[1]
循环中得到一个堆栈为空的错误,我不知道为什么。我使用的表达式应该等于 -6.0
任何帮助表示赞赏。
编辑:更改代码后,我处于类似情况,并假设我在某处推送或弹出时出错。再次浏览代码后,我仍然找不到错误。再次感谢任何帮助。
【问题讨论】:
我刚刚看到您进行了另一次编辑。一般来说,最好在新问题中提出更多问题,而不是编辑现有问题,因为对问题的编辑通常不会引起太多关注。此外,这将使您有机会包含您遇到的特定错误。 (顺便说一下,欢迎来到 SO!) 感谢您提供的信息,我不知道该怎么做。 刚刚想通是说我想通了 【参考方案1】:恐怕此代码存在其他问题(修复以下问题后您会发现),但您在问题中提到的问题来自您的 pop
方法:
def pop(self):
if self.is_empty():
print ('stack is empty') # still proceeds to the next line
return self._stack.pop() # won't work if self._stack is empty
这会引发 IndexError,因为您不能从空列表中pop
,并且无论列表是否为空,都会运行您的 return 语句。也许您正在追求类似以下的内容 (?):
def pop(self):
if self.is_empty():
print ('stack is empty')
return # now you need to deal with the returned None value
return self._stack.pop() # only if not empty
【讨论】:
@user3404267 你打赌。我希望它有所帮助。以上是关于在 Python 中使用堆栈评估中缀表达式:我找不到我的错误的主要内容,如果未能解决你的问题,请参考以下文章
数组模拟实现一个50个字符串的堆栈,使用堆栈,将中缀算术表达式转换成后缀表达式。