面试---两个队列实现一个栈

来源:互联网 发布:非线性规划的最优化 编辑:程序博客网 时间:2024/06/05 10:20

解法思路:

1)设置两个队列q1和q2。(2)栈的push操作:每次往非空队列里插入元素。起初都为空的时候则往q1中插入。(3)栈的pop操作:把非空队列里除最后一个元素外先转移到另一队列(为空),然后把剩下的最后一个元素弹出。这样另一个队列便作为下次插入的对象。(4)以此类推。

注:此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。

这样实现的栈的push和pop操作,其时间复杂度为O(n).

#include<iostream>#include<queue>using namespace std;template <class T> class CStack{public:    void push_stack(const T &);    T pop_stack();private:    queue<T> q1;    queue<T> q2;};template <class T> void CStack<T>::push_stack(const T &data){//每次往不空的队列插入元素,若都为空则往q1插入    q1.size() >= q2.size()?q1.push(data):q2.push(data);}template <class T> T CStack<T>::pop_stack(){    if(q1.size()==0)//如果q1为空    {        while(q2.size()>1)//把q2的除最后一个元素外全部转移到队q1中        {            q1.push(q2.front());            q2.pop();        }        T& front1=q2.front();//取队列头元素        q2.pop();        return front1;    }    else//如果q2为空    {        while(q1.size()>1)//把q1的除最后一个元素外全部转移到队q2中        {            q2.push(q1.front());            q1.pop();        }        T& front2=q1.front();        q1.pop();        return front2;    }}int main(){    CStack<int> s;    s.push_stack(1);    s.push_stack(2);    s.push_stack(3);    cout<<"元素出栈:"<<endl;//后入先出    cout<<s.pop_stack()<<endl;    cout<<s.pop_stack()<<endl;    cout<<s.pop_stack()<<endl;    return 0;}
0 0