版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用两个栈实现一个队列,这是一道很经典的面试题…emmm…然而怎么解决呢
首先明确解题思路:
队列的特性是:“先入先出”,栈的特性是:“先入后出”
1)建立两个栈A、B
- 栈A用来入队列
- 栈B用来出队列
2)入队出队操作
入队:将元素进栈A
出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈, 如果不为空,栈B直接出栈
class Solution
{
public:
void push(int node)
{
stack1.push(node);
}
int pop()
{
if(stack2.empty())
{
//将stack1中元素弹出压入到stack2中
while(!stack1.empty())
{
stack2.push(stack1.top());
//将stack2栈顶弹出即为队列的队头元素
stack1.pop();
}
}
else//如果stack2不为空,则直接弹出栈顶元素即为队头元素
{
res = stack2.top();
stack2.pop();
return res;
}
}
private:
stack<int> stack1;
stack<int> stack2;
int res;
};
以上代码我们可以通过举例来说明:
插入数 a,b,c,d入队列,此时的栈情况为:
- 栈 stack1:{a,b,c,d}
- 栈 stack2:{ }
弹出a,a在stack1的最下面,将stack1中全部元素逐个弹出压入stack2,从stack2中弹出a,此时的栈情况为:
- 栈 stack1:{ }
- 栈 stack2:{d,c,b}
继续弹出b ,b比 c 先进入,b在stack2的栈顶,可直接弹出,此时的栈情况为:
- 栈 stack1:{ }
- 栈 stack2:{d,c}
同样的,可依次将c,d从栈stack2中弹出即可
从该题同样可以引申出“如何用两个队列实现栈”,解题思路如下:
1)建立两个队列A、B
- 栈A用来入栈
- 栈B用来出栈
2)入栈出栈操作
入栈:将元素进队列A
出栈:判断队列A中元素的个数是否为1,如果等于1,则出队列,否则将队列A中的元素 以此出队列并放入队列B,直到队列A中的元素留下一个,然后队列A出队列,再把队列B中的元素出队列以此放入队列A中