我的 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