题目:用两个队列实现一个栈
现有两个队列q1与q2,必须保证q1,q2中有一个始终为空,
入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;
出栈:后进先出那么4要出栈。但是q1是一个队列,先进先出,那么 先让1 2 3出队列q1,然后q2入队列1 2 3,q1中此时剩余4,把4出对列达到出栈的效果;
这个时候如果我们又加入一个元素5,那么我们应该把5放到q1还是q2,因为现在q2中有 1 2 3,要保证q1,q2中有一个为空,所以要把5放入到q2;
依次循环以上出桟入栈。
入栈过程中:
如果q1与q2都为空,那么往q1中插入元素(优先q1)
如果q1不为空,那么往q1中插入元素(必须保证q1,q2中有一个始终为空,所以q2为空)
如果q2不为空,那么往q2中插入元素(必须保证q1,q2中有一个始终为空,所以q1为空)
#include<queue>
#include<iostream>
using namespace std;
template<class T>
class Stack
{
private:
queue<T> q1;
queue<T> q2;
public:
Stack(){}
void my_push(const T&);
T& my_pop();
};
template<class T>
void Stack<T>::my_push(const T& elem)
{
//1.必须保证q1与q2有一个队列为空,如果两个都为空,则向q1插入元素,
//2.向不为空的队列插入元素
if(q1.size()==0&&q2.size()==0)//如果q1与q2都为空,那么往q1中插入元素
{
q1.push(elem);
}
else if(q1.size()>0)//如果q1不为空,那么往q1中插入元素
{
q1.push(elem);
}
else //q2不为空,往q2中插入元素
{
q2.push(elem);
}
}
template<class T>
T& Stack<T>::my_pop()
{
T ret;
if(q1.size()>0)//此处就要让q1依次出队列,进入空队列q2,得到q1最后一个元素
{
while(q1.size()!=1)
{
q2.push(q1.front());
q1.pop();
}
ret=q1.front();//出桟的值
q1.pop(); //q1为空了
}
else //此处就要让q2依次出队列,进入空队列q1,得到q2最后一个元素
{
while(q2.size()!=1)
{
q1.push(q2.front());
q2.pop();
}
ret=q2.front();//出桟的值
q2.pop(); //q2为空了
}
return ret;
}
int main()
{
Stack<int> s;
s.my_push(1);
s.my_push(2);
cout<<s.my_pop()<<" ";
s.my_push(0);
cout<<s.my_pop()<<" ";
cout<<s.my_pop()<<" ";
s.my_push(5);
cout<<s.my_pop()<<endl;
system("pause");
return 0;
}
运行结果: