【发布时间】:2015-06-14 10:46:16
【问题描述】:
我的堆栈的push 方法出现索引越界错误。
我正在尝试在 python 中实现一个后缀样式的逻辑计算器。例如0!1&1!0=!1/| 将评估为 1 或 true。
我使用堆栈和与此类列表“push”和“pop”相关联的常用方法来实现这一点,但我不允许使用典型的附加或删除方法,在这种实现中可能会很好。相反,我必须将列表初始化为一个标准大小,该大小等于我将对其执行评估的表达式的长度。
我使用名为evaluate 的方法来执行此操作,方法是引用一个名为top 的全局整数,该整数指向堆栈的顶部,并根据我调用push 或pop 而在其中递增或递减。
我的push方法如下
def push(stack, element):
global tos
tos += 1
stack[tos] = element
我的pop方法如下
def pop(stack):
#stack = None
global tos
tos -= 1
基本上,我使用
通读了字符串的每个单独元素for i in expression
然后我说,if i ==(某种表达方式):执行预制方法。
这是我在这个循环中找到的、遍历表达式的代码中的几个示例
if op == "1":
push(theStack, True)
elif op == "0":
push(theStack, False)
elif op == "!":
pop(None)
push(theStack, Not(theStack[tos]))
elif op == "&":
pop(None)
pop(None)
push(theStack, And(theStack[tos], theStack[tos + 1]))
我测试了pop,它似乎做了应该做的事。我认为错误在于我的push。
我将tos 初始化为-1,这也是我的方法顶部的一个快速峰值,在
def LogicalEval (expression):
global tos
theStack = [len(expression)]
def Not(expr):
if expr == True:
return False
else:
return True
def And (expr1, expr2):
if expr1 == True and expr2 == True:
return True
else:
return False
我不会在LogicalEval 之外的任何点启动堆栈,实际上我仅限于三个主要方法(push、pop、LogicalEval)在我的辅助方法之外,例如@在LogicalEval 中找到的987654343@ 和Not
【问题讨论】:
-
请修正格式。如果您在每行之前留 4 个空格,它将突出显示为代码。
-
那么这里的栈是怎么定义的?
-
另外,
tos的 initial 值是多少? -
另外我忘了提到我将 tos 初始化为 -1
-
@user3106485:您可以将其添加到您的问题中,只需 edit 即可。
标签: python list stack indexoutofboundsexception