题目详情
使用队列实现栈的下列操作:
push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-stack-using-queues
思路
因为队列的特点是先进先出,而栈的特点是后进先出(先进后出)。
所以我们的目的就是把先进队的元素转移到后面,比如 5 - 4 - 3依次进入队列,就需要转换成 3 - 4 - 5 的排列顺序,形成栈的结构。
所以假设我们先定义一个队列queue
std::queue<int> temp_queue;
由于每次push进队列的只有一个值。根据这个特点我们先把这个值push进队列(假设为5)
所以现在temp_queue = {5},对于第二个需要push的值(假设为4),肯定是不能直接push进temp_queue的,不然就又是队列的结构了。所以如果我们把temp_queue里有的值pop出来,并存到另外一个队列中(假设定义为data_queue),此时temp_queue为空,然后我们知道data_queue = {5}。
再把第二个值push进temp_queue,temp_queue = {4}。仔细观察可以发现,如果把data_queue里的值pop出来push进temp_queue。在temp_queue里就构成了 5->4 的队列 其中4在头部。然后再把temp_queue的值依次push进data_queue , data_queue就是对应的栈结构了。
后续的操作就很类似了
就是把data_queue里已经构成栈结构的成员看成一个整体,再进行上面同样的操作,就能实现把后进队的元素放到头部,从而一直构成栈的结构(如果画个图上面的过程会更清晰!)
其他函数的补充就比较简单不做笔记了,详情见下代码
class MyStack {
public:
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
std::queue<int> temp_queue;
temp_queue.push(x);
while(!data.empty())
{
temp_queue.push(data.front());
data.pop();
}
while(!temp_queue.empty())
{
data.push(temp_queue.front());
temp_queue.pop();
}
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int x = data.front();
data.pop();
return x;
}
/** Get the top element. */
int top() {
return data.front();
}
/** Returns whether the stack is empty. */
bool empty() {
return data.empty();
}
private:
std::queue<int> data;
};