232. 用栈实现队列

方法一:用两个栈

1.1 

入队时间复杂度:O(1)

出队时间复杂度:O(n)

class MyQueue
{
private:
    stack<int> s1;
    stack<int> s2;
    int front;     //用来记录“队首”元素
public:
    MyQueue() {}

    void push(int x)   
    {
        if (s1.empty() == true)
        {
            front = x;
        }                       
        s1.push(x);
    }

    int pop()        
    {
        while (s1.empty() == false)  
        {
            s2.push(s1.top());
            s1.pop();
        }

        int temp = s2.top();
        s2.pop();
        if (s2.empty() == false)
        {
            front = s2.top();
        }

        while (s2.empty() == false)
        {
            s1.push(s2.top());
            s2.pop();
        }                           
        return temp;
    }

    int peek()
    {
        return front;
    }

    bool empty()
    {                               
        return s1.empty();
    }
};

1.2

与1.1正好相反

入队时间复杂度:O(n)

出队时间复杂度:O(1)

class MyQueue
{
private:
    stack<int> s1;
    stack<int> s2;
    int front;
public:
    MyQueue() {}

    void push(int x)               //时间复杂度:O(n)
    {                              //空间复杂度:O(n)
        if (s1.empty() == true)
        {
            front = x;
        }

        while (s1.empty() == false)
        {
            s2.push(s1.top());
            s1.pop();
        }
        s1.push(x);
        while (s2.empty() == false)
        {
            s1.push(s2.top());
            s2.pop();
        }
    }

    int pop()
    {
        int temp = s1.top();     //时间复杂度:O(1)
                                 //空间复杂度:O(1)
        s1.pop();
        if (s1.empty() == false)
        {
            front = s1.top();
        }
        return temp;
    }

    int peek()
    {
        return front;
    }

    bool empty()
    {
        return s1.empty();
    }
};

方法二:

使用两个栈 入队 - O(1)出队 - 摊还复杂度 O(1)

class MyQueue 
{
private:
    stack<int> s1;
    stack<int> s2;
    int front;
public:
    MyQueue() {}

    void push(int x)
    {
        if (s1.empty() == true)
        {
            front = x;
        }

        s1.push(x);
    }

    int pop()
    {
        if (s2.empty() == true)
        {
            while (s1.empty() == false)
            {
                s2.push(s1.top());
                s1.pop();
            }
        }

        int temp = s2.top();
        s2.pop();
        return temp;
    }

    int peek()
    {
        if (s2.empty() == false)
        {
            return s2.top();
        }
        else
        {
            return front;
        }
    }

    bool empty()
    {
        return s1.empty() && s2.empty();
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值