栈的原理是先进后出,而队列的原理是先进先出,因此我们很容易下想到将数据先放到栈1,然后将栈1的数据一次pop出到栈2,这样到了栈2再pop时,数据就是和一开始进入栈1的顺序一样了。
但是我们需要考虑一个问题,那就是栈2是不是有值的情况,每次当栈1的数据pop到栈2时,我们都需要判断栈2的数据是不是为空。比如:先向栈1push三个数据1、2、3,这个时候按照栈的规律将数据一次pop到栈2,即为:3、2、1,这个时候对于栈2来说,我们pop的顺序就是想要的,这里我们先pop两次,即为:1、2,好,重点来了,3留在了栈2中,如果这个时候我们再push数据呢?
是的,我们需要考虑这种情况。栈1继续接收数据:4,则4需不需要pop到栈2呢,如果进去了,栈2就变成了:3、4,是的3成为了栈底,4成了栈顶,这个时候再pop栈2的话顺序就错了,因为我们想要pop的是3,那么怎么解决呢?
我们可以加一个判断,只要栈2不为空,就不想其中push数据,也就是说4这个值继续留在栈1中,等到栈为空的时候才可以push数据。那么对于栈1会不会有影响呢,答案是不会。之前的4已经留在了栈1中,如果这个这个时候又push的数据5,栈1变成:4、5,我们很惊喜的发现这个顺序依然是符合我们想要的结果的,因为如果这个时候栈2为空,将栈1的数据一次push到栈2的时候,栈2的数据为:5、4,然后我们pop数据,出来的依次是:4、5。
程序源码:
#include<iostream>
#include<stack>
using namespace std;
class solution
{
public:
void push(int node)
{
stack1.push(node); //将数据压入到栈1
}
int pop()
{
int temp;
if(stack2.empty()) //判断栈2是否为空,若为空则将栈1的数据压入到栈2中
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
temp=stack2.top();
stack2.pop();
return temp;
}
private:
stack<int>stack1;
stack<int>stack2;
};
int main()
{
solution tmp;
tmp.push(1);
tmp.push(2);
tmp.push(3);
cout<<tmp.pop()<<" ";
cout<<tmp.pop()<<" ";
tmp.push(4);
cout<<tmp.pop()<<" ";
tmp.push(5);
cout<<tmp.pop()<<" ";
cout<<tmp.pop()<<" ";
return 0;
}
结果展示: