使用队列伪代码实现堆栈

Posted

技术标签:

【中文标题】使用队列伪代码实现堆栈【英文标题】:Implementing stack using a queue pseudocode 【发布时间】:2018-05-30 17:16:46 【问题描述】:

我对以下伪代码感到困惑

■ 使用单个队列实现堆栈。具体来说,写 使用 enqueue 在堆栈上进行推送和弹出操作的伪代码 和队列的出队操作。考虑给定队列类 给你。我们将使用单个队列 q。考虑队列的前面是栈顶

推(x)

s   =   q.size()
q.enqueue(x)
for(int i = 0;  i < s;  i++)
q.enqueue(q.dequeue())

pop()
if  q.isEmpty()
“Exception”
return  q.dequeue()

我意识到堆栈的底部是队列的尾部。所以当我们入队时,它必须在栈底。所以我们必须从堆栈中删除所有内容并将该项目推入,然后将所有内容放回原处。我不明白“for(int i = 0; i

【问题讨论】:

刚刚修复。它使用队列实现堆栈。对不起 【参考方案1】:

分析队列在 for 循环中是如何变化的。代码只是添加新元素并重写其余部分)

s   =   q.size() .            // Initial queue: (in) -> A -> B -> C -> (out)
q.enqueue(x)                  //           (in) -> D -> A -> B -> C -> (out)
for(int i = 0;  i < s;  i++)
    q.enqueue(q.dequeue())    // i == 0: (in) -> C -> D -> A -> B -> (out)
                              // i == 1: (in) -> B -> C -> D -> A -> (out)
                              // i == 2: (in) -> A -> B -> C -> D -> (out)
pop()
if  q.isEmpty()
    “Exception”
return  q.dequeue()

【讨论】:

【参考方案2】:

假设您已经添加了 3 个值:

6  7  8

使用队列,只能在左侧添加,只能从右侧获取。

使用堆栈,您想在右侧添加,然后在右侧获取,即目标是在右侧添加下一个值 (9),如下所示:

6  7  8  9

但是,使用队列,您只能在左侧添加:

9  6  7  8

所以您想要做的是,使用有效的队列操作从右到左循环预先存在的值 (6 7 8),一次一个:

┌─> 8  9  6  7 ─┐
└───────────────┘

┌─> 7  8  9  6 ─┐
└───────────────┘

┌─> 6  7  8  9 ─┐
└───────────────┘

因此,要对 预先存在的 值执行此操作,您需要在 添加新值之前获取队列的大小,然后添加新值,然后移动最后一个值根据需要提前多次,即size 次。

【讨论】:

@andrewwgel 您应该对您认为有用的所有答案进行投票(即单击向上箭头)。您还应该通过单击复选标记来接受最佳答案,以向其他人表明您的问题已得到您满意的回答(当然,假设它已经回答)。 --- 欢迎来到 ***。 :-)【参考方案3】:

堆栈是一种数据结构,其中要插入的最后一个元素是要返回的第一个元素 (LIFO)。简单队列 (FIFO) 是一种按元素插入顺序返回元素的结构。

您所询问的循环正在对队列进行重新排序,因此刚刚插入的元素现在是第一个返回的元素。更准确地说,它使所有其他元素出列并排队,这使得刚刚插入的元素成为第一个返回的元素。所有其他元素都已在插入元素之后排队,这意味着插入元素现在是第一个出列的元素。

【讨论】:

以上是关于使用队列伪代码实现堆栈的主要内容,如果未能解决你的问题,请参考以下文章

Python实现简单多线程任务队列

数据结构-堆栈和队列最简单的实现(Python实现)

将优先级队列实现为堆栈Java

redis 实现任务队列

使用两个队列实现堆栈

高性能队列Disruptor使用入门,原理和代码实现