使用队列伪代码实现堆栈
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) 是一种按元素插入顺序返回元素的结构。
您所询问的循环正在对队列进行重新排序,因此刚刚插入的元素现在是第一个返回的元素。更准确地说,它使所有其他元素出列并排队,这使得刚刚插入的元素成为第一个返回的元素。所有其他元素都已在插入元素之后排队,这意味着插入元素现在是第一个出列的元素。
【讨论】:
以上是关于使用队列伪代码实现堆栈的主要内容,如果未能解决你的问题,请参考以下文章