力扣225. 用队列实现栈

题目来源(力扣):

https://leetcode.cn/problems/implement-stack-using-queues/

题目描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

基本思路:

可以参考用栈实现队列 https://www.cnblogs.com/hb-computer/articles/18509570
但是,由于队列始终是先进先出的,即使使用2个队列,[1,2,4,5]最终的出队列状态还是为[1,2,4,5]
因此,用2个队列que1、que2实现栈,其中que2只是用于备份数据
实际上对于pop操作,先将que1中的元素依次弹出到que2中,直到剩余1个元素,则该元素就是需要pop的元素

代码实现:

class MyStack
{
public:
    MyStack()
    {
    }

    void push(int x)
    {
        que1.push(x);
    }

    int pop()
    {
        // 先将que1的元素弹出到que2,且que1中剩余1个
        while (que1.size() > 1)
        {
            que2.push(que1.front());
            que1.pop();
        }
        int tmp = que1.front();
        que1.pop();
        // 再将que2中的元素弹回que1
        while (que2.size() > 0)
        {
            que1.push(que2.front());
            que2.pop();
        }
        return tmp;
    }

    int top()
    {
        int tmp = this->pop(); // 代码复用
        que1.push(tmp);
        return tmp;
    }

    bool empty()
    {
        if (que1.size() == 0 && que2.size() == 0)
            return 1;
        return 0;
    }

private:
    queue<int> que1, que2;
};

时间复杂度

push:O(1)
pop/top:O(n)
empty:O(1)

补充-只使用1个队列的写法

由于que2的只是用于临时存放数据,所以实际上可以将其优化掉,
只使用1个队列,并且用len维护长度,就能利用1个队列实现2个队列才能完成的工作,如下:

class MyStack
{
public:
    MyStack()
    {
        len = 0;
    }

    void push(int x)
    {
        que1.push(x);
        len++;
    }

    int pop()
    {
        int tmp_len = len;
        while (tmp_len > 1)
        {
            que1.push(que1.front());
            que1.pop();
            tmp_len--;
        }
        int tmp = que1.front();
        que1.pop();
        len--;
        return tmp;
    }

    int top()
    {
        int tmp = this->pop(); // 代码复用
        que1.push(tmp);
        len++;
        return tmp;
    }

    bool empty()
    {
        if (que1.size() == 0)
            return 1;
        return 0;
    }

private:
    queue<int> que1;
    int len;//维护长度
};

时间复杂度不变

posted @ 2024-10-28 09:41  HB_Computer  阅读(15)  评论(0)    收藏  举报