• 225. 用队列实现栈


    225. 用队列实现栈

    题目链接:225. 用队列实现栈(简单)

    题目描述

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

    实现 MyStack 类:

    • void push(int x) 将元素 x 压入栈顶。

    • int pop() 移除并返回栈顶元素。

    • int top() 返回栈顶元素。

    • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

    注意:

    • 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。

    • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

    示例:

    输入:
    ["MyStack", "push", "push", "top", "pop", "empty"]
    [[], [1], [2], [], [], []]
    输出:
    [null, null, null, 2, 2, false]

    解释:
    MyStack myStack = new MyStack();
    myStack.push(1);
    myStack.push(2);
    myStack.top(); // 返回 2
    myStack.pop(); // 返回 2
    myStack.empty(); // 返回 False

    提示:

    • 1 <= x <= 9

    • 最多调用100 次 push、pop、top 和 empty

    • 每次调用 pop 和 top 都保证栈不为空

    题解

    思路:根据题目的意思使用一个普通队列和一个用于备份数据的队列(其实这道题使用一个队列足以)。

    使用两个队列:对于push(),只需将元素一个一个地推入普通队列即可;对于pop(),首先将普通队列里面的前面 n-1 个元素(假设普通队列中总的有 n 个元素)弹出并推入备份队列,再将最后一个元素弹出即可;对于 top(),只需返回队尾元素即可;对于empty(),只需判断普通队列是否为空即可。

    使用一个队列:push(),top(),empty()的操作与”使用两个队列“的操作一样;对于pop(),首先将队列中的前面 n-1 个元素(假设队列中总的有 n 个元素)按顺序弹出并依次从队列末尾推入,再将最后一个元素弹出即可。

    代码(C++)

    //使用两个队列
    class MyStack {
    public:
        deque<int> deq1;//普通队列
        deque<int> deq2;//备份队列
    ​
        MyStack() {
    ​
        }
    ​
        void push(int x) {
            deq1.push_back(x);
        }
    ​
        int pop() {
            //如果队列1不为空,则将队列中的前 n-1 个元素(假设总的有 n 元素)推入队列2,再弹出最后一个元素
            while (deq1.size() - 1 > 0) {
                deq2.push_back(deq1.front());
                deq1.pop_front();
            }
            int result = deq1.front();
            deq1.pop_front();
            //将队列2中的元素全部推入队列1
            while (deq2.size() > 0) {
                deq1.push_back(deq2.front());
                deq2.pop_front();
            }
            return result;
        }
    ​
        int top() {
            return deq1.back();
        }
    ​
        bool empty() {
            if (deq1.empty()) return true;
            else return false;
        }
    };

    分析:

    • 时间复杂度:push():O(1);pop():O(N);top():O(1);empty():O(1);N是队列中的元素个数

    • 空间复杂度:O(N),需要两个队列。

    //使用一个队列
    class MyStack {
    public:
        deque<int> deq;
    ​
        MyStack() {
    ​
        }
    ​
        void push (int x) {
            deq.push_back(x);
        }
    ​
        int pop() {
            int size = deq.size();
            while (size - 1 > 0) {
                deq.push_back(deq.front());
                deq.pop_front();
                size--;
            }
            int result = deq.front();
            deq.pop_front();
            return result;
        }
    ​
        int top() {
            return deq.back();
        }
    ​
        bool empty() {
            return deq.empty();
        }
    ​
    };

    分析:

    • 时间复杂度:push():O(1);pop():O(N);top():O(1);empty():O(1);N是队列中的元素个数

    • 空间复杂度:O(N),需要一个队列。 

     

  • 相关阅读:
    如何优雅地使用 Stack Overflow
    Quartz总结
    slf4j-api、slf4j-log4j12以及log4j之间什么关系?
    eclipse 安装 spring boot suite 插件遇到的问题
    Java项目结构总结
    netstat 与 telnet
    微服务架构中的安全认证与鉴权
    git 常用命令
    session 、cookie、token的区别
    List和Set区别
  • 原文地址:https://www.cnblogs.com/wltree/p/15533462.html
Copyright © 2020-2023  润新知