栈与队列【每日一题】

来源:互联网 发布:制作音效的软件 编辑:程序博客网 时间:2024/05/24 07:34

1.两个栈实现一个队列:
思路一、s1是入栈的,s2是出栈的
入队列:直接压到s1里
出队列:先把s1中的元素全部压到s2中,弹出s2中的栈顶元素;
再把s2的所有元素压回s1中
思路二、s1是入栈的,s2是出栈的
入队列:如果s1为空,把s2中所有元素压到s1中;否则直接压入s1
出队列:如果s2不为空,把s2的栈顶元素直接弹出;否则把s1所有
元素全部弹出压入s2中,再弹出s2栈顶元素
思路三、s1是入栈的,s2是出栈的
入队列:直接压入s1即可
出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则把s1
的所有元素全部弹出压入s2中,再弹出s2的栈顶元素

#include <iostream>#include <stack>using namespace std;template <typename T> class CQueue{public:    CQueue()    {}    ~CQueue()    {}    void appendTail(const T& node)    {        s1.push (node);        cout<<node<<"->";    }    T deleteHead()    {        if(s2.size () <= 0)        {            while(s1.size () > 0)            {                T& data = s1.top ();                s1.pop ();                s2.push (data);            }        }        if(s2.size () == 0)            cout<<"队列为空!"<<endl;        T head = s2.top ();        s2.pop ();        cout<<head<<"->";        return head;    }private:    stack<T> s1;    stack<T> s2;};int main(){    CQueue<int> q;    cout<<"原队列:"<<endl;    q.appendTail (1);    q.appendTail (2);    q.appendTail (3);    q.appendTail (4);    cout<<endl;    cout<<"出队列元素:";    q.deleteHead ();    cout<<endl;    cout<<"插入队列元素:"<<endl;    q.appendTail (5);    q.appendTail (6);    q.appendTail (7);    cout<<endl;    cout<<"出队列元素:";    q.deleteHead ();    q.deleteHead ();    q.deleteHead ();    q.deleteHead ();    cout<<endl;    return 0;}

2.两个队列实现一个栈
算法思路:

现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是q1是一个队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果。 这个时候如果我们又加入一个元素5,那么我们应该把5放到q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2;如果5放到了q1,等下编写出栈的代码很麻烦,如果放到q2我们只需要分类:q2是不是为空,为空的为一种情况,不为空的为一种情况。
所以最后:
如果q1与q2都为空,那么往q1中插入元素
如果q1不为空,那么往q1中插入元素
如果q2不为空,那么往q1中插入元素

#include <iostream>  #include <queue>  using namespace std;  template <class T>class CStack{public:    CStack()    {}    ~CStack()    {}    void appendTail(const T& node)    {        if(q1.size ()==0 && q2.size () == 0)//如果q1与q2都为空,那么往q1中插入元素            q1.push (node);        else if(q1.size () > 0)//如果q1不为空,那么往q1中插入元素            q1.push (node);        else if(q2.size()>0)//如果q2不为空,那么往q1中插入元素            q2.push(node);        cout<<node<<"->";    }    T deleteTail()    {        T Tail;        if(q2.size () == 0)        {            while(q1.size () != 1)            {                T& data = q1.front ();                q1.pop ();                q2.push (data);            }            Tail = q1.front ();            q1.pop ();            cout<<Tail<<endl;        }        return Tail;    }private:    queue<T> q1;    queue<T> q2;};   int main(){    CStack<int> s;    s.appendTail (1);    s.appendTail (2);    s.appendTail (3);    s.appendTail (4);    s.appendTail (5);    s.appendTail (6);    s.deleteTail ();    s.deleteTail ();    return 0;}