两个栈实现一个队列
思路
进出栈两次之后与队列弹出顺序一致
stack1:负责压栈,stack2负责弹栈(如果为空,则将stack1中元素全部压入stack2)
注意:本身队列pop返回值为void,题目中要求的pop返回类型为int。
代码示例
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.empty())
{
while(!stack1.empty())
{
int val=stack1.top();
stack1.pop();
stack2.push(val);
}
}
int val=stack2.top();
stack2.pop();
return val;
}
private:
stack<int> stack1;
stack<int> stack2;
};
两个队列实现一个栈
在push的时候,往非空的那个队列添加(刚刚初始化的时候,两个队列都为空,随便往哪个队列push都行 下图步骤1和步骤3
在pop的时候,如果队列1不为空,就把队列1中q1.size()-1
个元素poll出来,添加到队列2中(下图步骤2中元素1和2),再把队列中那个最后的元素pop出来(步骤2中元素3)
这两个队列中始终有一个是空的。另一个非空。push添加元素到非空队列中,pop把非空队列中前面的元素都转移到另一个队列中,只剩最后一个元素,再把最后一个元素pop出来。这样这一个队列是空的,另一个队列又非空了。
代码示例
class Solution
{
public:
void push(int node)//在栈尾部添加数据
{
if (!q1.empty())//不为空的执行push操作
{
q1.push(node);
}
else
{
q2.push(node);
}
}
template<class T>
int pop()
{
int ret = 0;
if (q1.empty())
{
int i = q2.size();
while (i > 1 )//将q2队列中的数据pop到只剩一个
{
q1.push(q2.front());
q2.pop();
--i;
}
ret = q2.front();
q2.pop();
}
else
{
int i = q1.size();
while (i > 1)
{
q2.push(q1.front());
q1.pop();
--i;
}
ret = q1.front();
q1.pop();
}
return ret;
}
}
栈和队列常见操作附录
栈的基本操作:stack<int> s;
s.empty() 如果栈为空返回true,否则返回false
s.size() 返回栈中元素的个数
s.pop() 删除栈顶元素但不返回其值
s.top() 返回栈顶的元素,但不删除该元素
s.push() 在栈顶压入新元素
队列的基本操作:queue<int> q;
q.empty() 如果队列为空返回true,否则返回false
q.size() 返回队列中元素的个数
q.pop() 删除队列首元素但不返回其值
q.front() 返回队首元素的值,但不删除该元素
q.push() 在队尾压入新元素
q.back() 返回队列尾元素的值,但不删除该元素