在不使用临时堆栈的情况下以原始顺序返回元素到堆栈

Returning elements to stack in original order without using temporary stack

我有一个包含 n 个元素的堆栈 S 和一个最初为空的队列 Q。我必须实现一个算法,该算法使用 Q 来扫描 S 以查看它是否包含某个元素 x,附加约束是我的算法必须 return 将元素返回到 S按照他们原来的顺序。强制性是我可能只使用S,Q和其他变量的常数。

我已经实现了这个算法,它使用一个临时堆栈来保存元素,然后 return 它们以原来的顺序进入原始堆栈,但是我如何在不使用临时堆栈的情况下完成这个任务?

if __name__ == '__main__':
    
    def scan(S, Q, x):
        
        for i in range(10):
            S.push(i)
        
        S1 = ArrayStack()
        flag = False
        
        for i in range(len(S)):
            Q.enqueue(S.pop())
            if Q.first() == x:
                flag = True
                print("Your desired element has been found:", Q.first())
                S1.push(Q.dequeue())
                break
            else:
                S1.push(Q.dequeue())
                
        if flag == False: 
            print("Sadly, your desired element could not be found.")
                
        
        for i in range(len(S1)):
            S.push(S1.pop())
         
        
    scan(ArrayStack(), LinkedQueue(), 9)

诀窍是首先将队列中的元素放回堆栈——这将使它们以相反的顺序放置——但然后对相同数量的值再次重复该过程:将它们从堆栈弹出到队列,然后再次将队列刷新回堆栈。现在他们将回到原来的顺序。

不确定函数的签名是否已经像那样给了你,但我不会将 Q 作为参数传递,因为它只服务于函数的算法,而不是调用者。另一方面,我不会在函数 内部 初始化堆栈,而是让调用者处理堆栈填充。这样调用者就可以控制使用哪些堆栈数据来调用函数。

所以这就是你可以做的:

def scan(S, x):
    Q = LinkedQueue()  # Create the queue here
    
    found = False
    for i in range(len(S)):
        Q.enqueue(S.pop())
        found = Q.first() == x
        if found:
            break
    i += 1  # The number of values that are currently in the queue
    # Flush the queue on the stack
    for j in range(i):
        S.push(Q.dequeue())
    # They are reversed on the stack, so remove them again
    for j in range(i):
        Q.enqueue(S.pop())
    # and finally flush the queue again
    for j in range(i):
        S.push(Q.dequeue())
    return found

这样调用:

S = ArrayStack()
# Initialise the stack here
for i in range(10):
    S.push(i)    
# Get the boolean result from the function call
found = scan(S, 12)
# Use it to display a message
if found:
    print("Your desired element has been found")
else:
    print("Sadly, your desired element could not be found.")