zoukankan      html  css  js  c++  java
  • 数据结构和算法-栈和队列

    用栈实现队列

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

    实现 MyQueue 类:

    void push(int x) 将元素 x 推到队列的末尾
    int pop() 从队列的开头移除并返回元素
    int peek() 返回队列开头的元素
    boolean empty() 如果队列为空,返回 true ;否则,返回 false

    说明:

    你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
    你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

    进阶:

    你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。

    示例:

    输入:
    ["MyQueue", "push", "push", "peek", "pop", "empty"]
    [[], [1], [2], [], [], []]
    输出:
    [null, null, null, 1, 1, false]

    解释:

    MyQueue myQueue = new MyQueue();
    myQueue.push(1); // queue is: [1]
    myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
    myQueue.peek(); // return 1
    myQueue.pop(); // return 1, queue is [2]
    myQueue.empty(); // return false
    

    提示:

    1 <= x <= 9
    最多调用 100 次 push、pop、peek 和 empty
    假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

    class MyQueue:
    
        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.stack1 = []
            self.stack2 = []
    
        def push(self, x: int) -> None:
            """
            Push element x to the back of queue.
            """
            self.stack1.append(x)
    
        def pop(self) -> int:
            """
            Removes the element from in front of queue and returns that element.
            """
            if self.stack2 == []:
                while self.stack1:
                    self.stack2.append(self.stack1.pop())
                
                return self.stack2.pop()
            else:
                return self.stack2.pop()
    
        def peek(self) -> int:
            """
            Get the front element.
            """
            if self.stack2 == []:
                while self.stack1:
                    self.stack2.append(self.stack1.pop())
                
                return self.stack2[-1]
            else:
                return self.stack2[-1]
    
    
        def empty(self) -> bool:
            """
            Returns whether the queue is empty.
            """
            if self.stack1  == [] and  self.stack2 == []:
                return True
            else:
                return False
    
    总结:
    • 栈的特点是LIFO,队列的特点是FIFO;
    • 本算法的时间复杂度和空间复杂度都为O(1);
    • 思路:使用两个列表,来表示栈的数据结构,利用pop函数表示出栈,append表示入栈,队列的入栈操作push直接进入stack1,出栈和取顶值时,先判断stack2是否为空栈。
  • 相关阅读:
    September 29th 2017 Week 39th Friday
    September 28th 2017 Week 39th Thursday
    September 27th 2017 Week 39th Wednesday
    September 26th 2017 Week 39th Tuesday
    September 25th 2017 Week 39th Monday
    September 24th 2017 Week 39th Sunday
    angular2 学习笔记 ( Form 表单 )
    angular2 学习笔记 ( Component 组件)
    angular2 学习笔记 ( Http 请求)
    angular2 学习笔记 ( Router 路由 )
  • 原文地址:https://www.cnblogs.com/01black-white/p/14493484.html
Copyright © 2011-2022 走看看