题目描述

使用栈实现队列的下列操作:

  • push(x) -- 将一个元素放入队列的尾部。

  • pop() -- 从队列首部移除元素。

  • peek() -- 返回队列首部的元素。

  • empty() -- 返回队列是否为空。

示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);  
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

说明:

  • 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from topsize和  is empty 操作是合法的。

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

  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

题目分析

这是一道很典型的为初级算法爱好者准备的算法题,首先简单介绍一下 队列 和  这两种数据结构。

队列

队列是一种 先进先出(first in - first out, FIFO)的数据结构,队列中的元素都从后端(rear)入队(push),从前端(front)出队(pop)。 

栈是一种 后进先出(last in - first out, LIFO)的数据结构,栈中元素从栈顶(top)压入(push),也从栈顶弹出(pop)。


为了满足队列的 FIFO 的特性,我们需要用到两个栈,用它们其中一个来进行入队操作,用另一个来进行出队操作。

动画演示


参考代码

//@author:程序员吴师兄
class MyQueue {

    private Stack<Integer> in = new Stack<>(), out = new Stack<>();

    //定义一个辅助函数来处理当 out 为空时,将 in 里面的数据挪到 out 中去
    private void transferIfEmpty() {
         if (out.empty()){
             while (!in.empty()){
                   out.push(in.pop());
             }
         }
    }

    /** Initialize your data structure here. */
    public MyQueue() {

    }

    /** Push element x to the back of queue. */
    public void push(int x) {
        in.push(x);
    }

    /** Removes the element from in front of queue and returns that element. */
    public int pop() {
      transferIfEmpty();
      return out.pop();
    }

    /** Get the front element. */
    public int peek() {
      transferIfEmpty();
      return out.peek();
    }

    /** Returns whether the queue is empty. */
    public boolean empty() {
      return in.empty() && out.empty();
    }
}

复杂度分析

代码实现中涉及到多个函数,每个函数的复杂度是有所区别的。

push操作

  • 时间复杂度:O(n) 。通过动画可知,除了新元素之外的其它元素,它们都会被压入两次,弹出两次。新元素只被压入一次,弹出一次。这个过程产生了 4n + 2 次操作,其中 n 是队列的大小。由于 压入 操作和 弹出 操作的时间复杂度为 O(1), 因此时间复杂度为 O(n)。

  • 空间复杂度:O(n)。需要额外的内存来存储队列中的元素,因此空间复杂度为 O(n)。

pop操作

  • 时间复杂度:O(1) 。 

  • 空间复杂度:O(1)。

peek操作

  • 时间复杂度:O(1) 。 

  • 空间复杂度:O(1)。

empty操作

  • 时间复杂度:O(1) 。 

  • 空间复杂度:O(1)。

知识点

栈、队列


©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. LeetCode 题解 | 406 号问题:根据身高重建队列
  2. JavaScript 数据结构(2-2):栈与队列-队列篇
  3. JavaScript 数据结构(2-1):栈与队列-栈篇
  4. 图解「剑指Offer」之使用栈实现队列
  5. 巩固 | 最全面的算法复杂度分析
  6. 这道算法题太简单?你忽略了时间复杂度的要求!
  7. 几道和「堆栈、队列」有关的面试算法题
  8. 冰与火之歌:「时间」与「空间」复杂度
  9. 看动画轻松理解时间复杂度(二)

随机推荐

  1. Jsoup对html文档的解析
  2. HTML5 Canvas 绘图方法整理 【十五、Canv
  3. 在PHP中获取幕布元素ID的文本[重复]
  4. HTML5引擎Construct2技术剖析(六)
  5. 使用jQuery随机化一系列div元素
  6. flah网站发布问题,我是在flash里面直接发
  7. CSS文件filemtime没有调用路径两次
  8. EasyUI学习之输入框
  9. Jquery中的事件处理(自动触发事件,禁用按
  10. ext给grid加toolTip提示(转自http://blog.