力扣232. 用栈实现队列

题目来源(力扣):

https://leetcode.cn/problems/implement-queue-using-stacks/

题目描述:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)

基本思路:
队列是先进先出的STL,而栈是先进后出的STL。
要利用栈实现队列,则应该使用2个栈sta1、sta2,
其中sta1用于存放push操作插入的值,
sta2用于pop、peek操作输出队首的数据,
4种操作(push、pop、peek、empty)依次对应于:
push
直接插入到sta1的栈顶

pop
如果sta2不为空则返回sta2的栈顶并且删除sta2的栈顶元素;
如果sta2为空,则依次弹出sta1的栈顶元素,再依次输入到sta2中,最后返回sta2的栈顶并且删除sta2的栈顶元素。
例如sta1:[1,2],sta2[]:[],此时调用pop,应该输出的数为[1]
而sta2.size()为0,sta1.top()为2,
将sta1的栈顶依次弹出到sta2,则
sta1:[], sta2:[2,1]
弹出sta2栈顶,sta.top()为[1]
之后sta1[]:[],sta2:[2]

peek
与pop类似,只是不需要删除sta2的栈顶元素而只返回即可

empty
判断是否sta1.size()为0且sta2.size()为0

因此,代码如下:

代码实现:

class MyQueue
{
public:
    MyQueue()
    {
    }

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

    int pop()
    {
        if (sta2.size())
        {
            int tmp = sta2.top();
            sta2.pop();
            return tmp;
        }
        else
        {
            while (sta1.size())
            {
                sta2.push(sta1.top());
                sta1.pop();
            }
            int tmp = sta2.top();
            sta2.pop();
            return tmp;
        }
    }

    int peek()
    {
        if (sta2.size())
        {
            int tmp = sta2.top();
            // sta2.pop();
            return tmp;
        }
        else
        {
            while (sta1.size())
            {
                sta2.push(sta1.top());
                sta1.pop();
            }
            int tmp = sta2.top();
            // sta2.pop();
            return tmp;
        }
    }

    bool empty()
    {
        if (sta1.size() == 0 && sta2.size() == 0)
            return 1;
        return 0;
    }

private:
    stack<int> sta1, sta2;
};

时间复杂度

push:O(1)
pop/peek:O(1)~O(n),一般认为均摊O(1)。对于每个元素,至多入栈和出栈各两次,故均摊复杂度为 O(1)。
empty:O(1)

补充

由于pop和peek操作过于类似,因此可以代码复用,如下:

class MyQueue
{
public:
    MyQueue()
    {
    }

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

    int pop()
    {
        if (sta2.size())
        {
            int tmp = sta2.top();
            sta2.pop();
            return tmp;
        }
        else
        {
            while (sta1.size())
            {
                sta2.push(sta1.top());
                sta1.pop();
            }
            int tmp = sta2.top();
            sta2.pop();
            return tmp;
        }
    }

    int peek()
    {
        int tmp = this->pop();
        sta2.push(tmp);
        return tmp;
    }

    bool empty()
    {
        if (sta1.size() == 0 && sta2.size() == 0)
            return 1;
        return 0;
    }

private:
    stack<int> sta1, sta2;
};
posted @ 2024-10-28 08:53  HB_Computer  阅读(28)  评论(0)    收藏  举报