专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
创意铺子  ·  79 元/2 件!开春针织这样穿,藏肉显瘦又高级! ·  17 小时前  
普象工业设计小站  ·  惊掉下巴!纯纸质的摩托车模型,放大看细节,简 ... ·  昨天  
普象工业设计小站  ·  不到百元入Jennie同款牛仔裤,也太显腿直 ... ·  昨天  
闵行消保委  ·  太治愈了~打开闵行这些地标的另一面→ ·  昨天  
闵行消保委  ·  太治愈了~打开闵行这些地标的另一面→ ·  昨天  
普象工业设计小站  ·  珍惜罕见!100年前影像,颠覆想象,高清复原 ... ·  3 天前  
51好读  ›  专栏  ›  吴师兄学算法

图解「剑指Offer」之使用栈实现队列

吴师兄学算法  · 公众号  ·  · 2019-09-03 12:15

正文

点击蓝色“ 五分钟学算法 ”关注我哟

加个“ 星标 ”,天天中午 12:15,一起学算法

作者 | 程序员小吴

来源 | 五分钟学算法

题目描述

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

  • 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 top size 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 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操作







请到「今天看啥」查看全文