前言
通过我们在数据结构中的学习(或者可以直接看博主的《数据结构专栏》),我们知道:
- 栈是先进后出的数据结构
- 队列是先进先出的数据结构
即栈是逆序的,队列是顺序的,因此我们通过两个栈(逆序的逆序为顺序)可以实现队列
实现思路
利用2
个栈stack1
和stack2
实现队列
- 将元素压入到
stack1
用来模拟入队操作 stack1
压入完成后弹出并将stack1
中所有元素压入到stack2
(此时已经为顺序,且stack2
栈顶为队头)stack2
如果不为空,直接进行弹出,即为出队操作- 如果
stack2
为空,进行步骤2
的操作,如果两个栈stack1
和stack2
都为空,则队列为空
示意图如下:
2个栈实现队列的最大容量
我们令stack1
和stack2
的容量分别为p
和q
,其中stack1
的容量更大–p
更大些
根据们在上一步的分析:
若要使stack1
中的元素要按照队列的顺序弹出,stack1
中的元素必须先压入stack2
才能实现顺序出队
因此:
若stack2
已经满,而stack1
中还能压入元素,则stack1中压入的元素不能超过stack2
的容量,此时队列的容量为2*q(q<p)
,如下图所示:
但这里我们假定stack2
为负责出队的栈,而如果stack1
也可以负责出队的话,则stack1
还能再压入一个元素(stack1
中的元素全部压入stack2
后从stack1
出队,再从stack2
出队),依然能够满足队列的要求
如下图所示:
因此,使用两个栈实现队列的最大容量为容量较小的栈的容量*2+1
用2个栈实现队列的C++代码
使用了C++语言进行了实现,完整代码见Github
代码运行效果如下:
拓展—牛客网题目链接
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
class Solution{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int res;
if(!stack2.empty()){
res=stack2.top();
stack2.pop();
}else if(!stack1.empty()){
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
res=stack2.top();
stack2.pop();
}
return res;
}
private:
stack<int> stack1;
stack<int> stack2;
};
运行时间:2ms
占用内存:504k