我的 pop() 函数不会删除列表的顶部元素,而是随机删除一个元素
my pop( ) function does not delete the top element of a list, but rather a random one
我创建了以下弹出函数:
def pop(arr):
if not isempty(arr):
topelement = arr[len(arr)-1]
arr.remove(topelement)
return topelement
在我使用它来颠倒一堆数字和运算符的顺序之前,它工作正常:
"3 6 2 + * 14 3 4 + + /"
进入
"/ + + 4 3 14 * + 2 6 3".
在如下所示的 while 循环的第一次迭代中,它将“/”运算符推入辅助堆栈并将其从条目顶部删除,这没问题 - 但在第二次迭代中,它从中间删除了“+”符号的条目而不是具有最高索引的加号。
def evaluation(eq):
entryunsplit = errpostfix(eq)
entry = entryunsplit.split()
lengthofentry = len(entry)
stack = []
while len(stack) != lengthofentry:
push(stack,pop(entry))
有人能解释一下为什么它没有删除最后一个元素吗?我该如何避免这个错误?
我将整个代码放在下面,以防其他元素变得重要。
stack1 = []
max_size = 30
def push(arr,a):
if len(arr) < max_size:
arr.append(a)
def isempty(arr):
if len(arr) == 0:
return True
else:
return False
def top(arr):
if not isempty(arr):
return arr[len(arr)-1]
def pop(arr):
if not isempty(arr):
topelement = arr[len(arr)-1]
arr.remove(topelement)
return topelement
def errpostfix(eq):
entry = eq.split()
opstack = []
exit = []
priorities = { "+": 1, "-": 1, "*": 0, "/": 0 }
for token in entry:
if token == "(":
push(opstack,token)
elif token == "*" or token == "/" or token == "+" or token == "-":
if top(opstack) == "*" or top(opstack) == "/" or top(opstack) == "+" or top(opstack) == "-":
while not isempty(opstack) and priorities[top(opstack)] >= priorities[token]:
push(exit,pop(opstack))
isempty(opstack)
push(opstack,token)
elif token == ")":
while top(opstack) != "(":
push(exit,pop(opstack))
pop(opstack)
else:
push(exit,token)
while not isempty(opstack):
push(exit, pop(opstack))
output = " ".join(exit)
return output
def isop(ch):
if ch == "+" or ch == "-" or ch == "*" or ch == "/":
return True
else:
return False
def evaluation(eq):
entryunsplit = "3 6 2 + * 14 3 4 + + /"
entry = entryunsplit.split()
lengthofentry = len(entry)
stack = []
while len(stack) != lengthofentry:
push(stack,pop(entry))
对列表的 remove()
操作将删除该列表中第一个 项,不是“随机”的(检查 docs ).如果有多个重复元素,第一个遇到的元素将被删除。要删除最后一个元素,只需使用 built-in pop()
方法:
def pop(arr):
if not isempty(arr):
topelement = arr[-1]
arr.pop()
return topelement
我创建了以下弹出函数:
def pop(arr):
if not isempty(arr):
topelement = arr[len(arr)-1]
arr.remove(topelement)
return topelement
在我使用它来颠倒一堆数字和运算符的顺序之前,它工作正常:
"3 6 2 + * 14 3 4 + + /"
进入
"/ + + 4 3 14 * + 2 6 3".
在如下所示的 while 循环的第一次迭代中,它将“/”运算符推入辅助堆栈并将其从条目顶部删除,这没问题 - 但在第二次迭代中,它从中间删除了“+”符号的条目而不是具有最高索引的加号。
def evaluation(eq):
entryunsplit = errpostfix(eq)
entry = entryunsplit.split()
lengthofentry = len(entry)
stack = []
while len(stack) != lengthofentry:
push(stack,pop(entry))
有人能解释一下为什么它没有删除最后一个元素吗?我该如何避免这个错误?
我将整个代码放在下面,以防其他元素变得重要。
stack1 = []
max_size = 30
def push(arr,a):
if len(arr) < max_size:
arr.append(a)
def isempty(arr):
if len(arr) == 0:
return True
else:
return False
def top(arr):
if not isempty(arr):
return arr[len(arr)-1]
def pop(arr):
if not isempty(arr):
topelement = arr[len(arr)-1]
arr.remove(topelement)
return topelement
def errpostfix(eq):
entry = eq.split()
opstack = []
exit = []
priorities = { "+": 1, "-": 1, "*": 0, "/": 0 }
for token in entry:
if token == "(":
push(opstack,token)
elif token == "*" or token == "/" or token == "+" or token == "-":
if top(opstack) == "*" or top(opstack) == "/" or top(opstack) == "+" or top(opstack) == "-":
while not isempty(opstack) and priorities[top(opstack)] >= priorities[token]:
push(exit,pop(opstack))
isempty(opstack)
push(opstack,token)
elif token == ")":
while top(opstack) != "(":
push(exit,pop(opstack))
pop(opstack)
else:
push(exit,token)
while not isempty(opstack):
push(exit, pop(opstack))
output = " ".join(exit)
return output
def isop(ch):
if ch == "+" or ch == "-" or ch == "*" or ch == "/":
return True
else:
return False
def evaluation(eq):
entryunsplit = "3 6 2 + * 14 3 4 + + /"
entry = entryunsplit.split()
lengthofentry = len(entry)
stack = []
while len(stack) != lengthofentry:
push(stack,pop(entry))
对列表的 remove()
操作将删除该列表中第一个 项,不是“随机”的(检查 docs ).如果有多个重复元素,第一个遇到的元素将被删除。要删除最后一个元素,只需使用 built-in pop()
方法:
def pop(arr):
if not isempty(arr):
topelement = arr[-1]
arr.pop()
return topelement