我对以下伪代码感到困惑
■使用单个队列实现堆栈。具体来说,写 使用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&lt; s; i ++) q.enqueue(q.dequeue())“我认为这就是我所说的,但有人可以引导我完成它吗?谢谢!
答案 0 :(得分:1)
假设您已经添加了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
次。
答案 1 :(得分:0)
堆栈是一种数据结构,其中要插入的最后一个元素是要返回的第一个元素(LIFO)。简单队列(FIFO)是一种按照插入顺序返回元素的结构。
您要问的循环是对队列进行重新排序,因此刚刚插入的元素现在是第一个被返回的元素。更确切地说,它将所有其他元素排队并排队,这使得刚插入的元素返回第一个元素。所有其他元素都在插入元素后排队,这意味着插入的元素现在是第一个被出列的元素。
答案 2 :(得分:0)
分析队列在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()