剑指offer:用两个栈实现队列
我们知道栈是先进后出,而队列是先进先出, 所以想法也十分简单,使用两个栈,我们把第一个栈的元素"倒进"第二个栈就可以了。
中间的疑问是,如果一边push,一边pop,会不会出问题。具体看图:
将 stack1 中的元素倒入 stack2中。
这时直接将 stack2中的元素输出,即可实现先进的元素先出。
如果push( ), pop( ) 操作是混合的,其实通过判断stack2 是否为空可以完美解决。
stack2 中的元素其实已经是按队列的要求可以输出的元素。所以,执行pop( )操作时,先检查 stack2 中是否有元素,如果有元素,先输出 stack2 栈顶的元素;如果 stack2 是空的那么将 stack1 中的元素再 “倒入” stack2 中,再输出此时 stack2 顶端的元素即可。
实现:
已在牛客网编程通过。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int value;
if (stack2.empty() == false)
{
value = stack2.top();
stack2.pop();
}
else
{
while(stack1.empty() == false)
{
stack2.push(stack1.top());
stack1.pop();
}
value = stack2.top();
stack2.pop();
}
return value;
}
private:
stack<int> stack1;
stack<int> stack2;
};
思考:使用两个队列实现栈,比第一个稍复杂。
#include<cstdio>
#include<queue>
using namespace std;
class Solution{
public:
void push(int value)
{
if (Q1.empty() == false)
{
Q1.push(value);
}
else Q2.push(value);
}
int pop()
{
int value;
if (Q1.empty() == false)
{
int size = Q1.size();
for (int i = 1; i < size; i++)
{
Q2.push(Q1.front());
Q1.pop();
}
value = Q1.front();
Q1.pop();
}
else
{
if (Q2.empty() == true) return -1;
int sizer = Q2.size();
for (int i = 1; i < sizer; i++)
{
Q1.push(Q2.front());
Q2.pop();
}
value = Q2.front();
Q2.pop();
}
return value;
}
private:
queue<int> Q1;
queue<int> Q2;
};
int main()
{
class Solution Solu;
Solu.push(1);
Solu.push(4);
Solu.push(2);
printf("%d", Solu.pop());
printf("%d", Solu.pop());
}