zoukankan      html  css  js  c++  java
  • 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),需要一个队列。 

     

  • 相关阅读:
    HBase学习之路 (六)过滤器
    Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'userController' method
    Java简答题附答案
    Java习题附答案
    精选30道Java笔试题附答案分析
    Java数据结构面试题
    NoSuchBeanDefinitionException: No qualifying bean of type 'com.bj186.ssm.mapper.EmployeeMapper' available: expected at least 1 bean which qualifies as autowire candidate
    Caused by: java.lang.ClassNotFoundException: java.com.bj186.ssm.controller.UserController
    Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
    Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/config/spring/applicationContext.xml]
  • 原文地址:https://www.cnblogs.com/wltree/p/15533462.html
Copyright © 2011-2022 走看看