两个队列实现栈的基本要点为:
pop操作:
1、保证始终一个队列为空
2、当要pop()时,将有元素的队列的的元素取出,然后放到另外一个队列中去,直到元素只剩下一个,当然这个元素是需要pop掉的元素。
push操作:
直接往有元素的一个队列中添加元素。
感觉这个思想,就相当于数组每次跑一次循环,然后找到最后一个元素,不过这边的数组相当于队列,因为队列跑循环的话会丢失前边的元素,所以需要另一个队列来存储前面的元素。时间复杂度O(n^n)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 10;
struct Stack
{
queue<int>q1,q2;
Stack()
{
while(q1.size())q1.pop();
while(q2.size())q2.pop();
}
void push(int x)
{
if(! q1.empty())
{
q1.push(x);
}
else q2.push(x);
}
int pop()
{
if(!q1.empty())
{
while(q1.size() > 1)
{
q2.push(q1.front());
q1.pop();
}
int ret = q1.front();
q1.pop();
return ret;
}
else
{
while(q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
int ret = q2.front();
q2.pop();
return ret;
}
}
int size()
{
return q1.size() + q2.size();
}
}st;
//test
int main()
{
for(int i = 1;i <= 10;i ++)
st.push(i);
while(st.size())
{
cout << st.pop() << endl;
}
return 0;
}