栈与队列【每日一题】

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值