LeetCode#232-Implement Queue using Stacks-用栈实现队列
一、题目
使用栈实现队列的下列操作:
- 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 操作)。
 
二、题解
- 解法1:两个栈
 
队列是先进先出,栈是先进后出。所以可以用两个栈,新元素压入栈的时候,先将栈中的元素弹出,放到另一个栈中,把新元素压入到栈的底部,再把另一个栈的元素弹出,放回原栈中。此时,栈顶元素就是出队时要先出的队首元素。

这里用的是数组表示队列,空间复杂度O(n),时间复杂度分 push 和 pop ,前者是O(n),后者是O(1)。
class MyQueue {
    /**
     * Initialize your data structure here.
     */
    function __construct() {
        $this->stack1 = [];
        $this->stack2 = [];
    }
    /**
     * Push element x to the back of queue.
     * @param Integer $x
     * @return NULL
     */
    function push($x) {
        while (!$this->empty()) {
            $this->stack2[] = array_pop($this->stack1);
        }
        $this->stack1[] = $x;
        while (!empty($this->stack2)) {
            $this->stack1[] = array_pop($this->stack2);
        }
    }
    /**
     * Removes the element from in front of queue and returns that element.
     * @return Integer
     */
    function pop() {
        return array_pop($this->stack1);
    }
    /**
     * Get the front element.
     * @return Integer
     */
    function peek() {
        return end($this->stack1);
    }
    /**
     * Returns whether the queue is empty.
     * @return Boolean
     */
    function empty() {
        return empty($this->stack1) ? true :false;
    }
}
- 解法2:两个栈
 
使用两个栈,一个栈(stack1)仅负责入栈,一个栈(stack2)仅负责出栈。有新元素入队时,直接将元素压入 stack1 即可。但当出队时,需要判断 stack2 是否为空,如果为空,将 stack1 的元素依次出栈,压入 stack2 中,随后从 stack2 弹出,即为出队。但当 stack2 不为空时,仍然直接从 stack2 出栈即可,知道 stack2 为空时,才可将 stack1 的元素拿出来放入 stack2 中。

这里用的是数组表示队列,空间复杂度O(n),时间复杂度分 push 和 pop ,前者是O(n),后者是O(1)。
class MyQueue2 {
    /**
     * Initialize your data structure here.
     */
    function __construct() {
        $this->stack1 = [];
        $this->stack2 = [];
    }
    /**
     * Push element x to the back of queue.
     * @param Integer $x
     * @return NULL
     */
    function push($x) {
        $this->stack1[] = $x;
    }
    /**
     * Removes the element from in front of queue and returns that element.
     * @return Integer
     */
    function pop() {
        if (empty($this->stack2)) {
            while (!empty($this->stack1)) {
                $this->stack2[] = array_pop($this->stack1);
            }
        }
        return array_pop($this->stack2);
    }
    /**
     * Get the front element.
     * @return Integer
     */
    function peek() {
        if (empty($this->stack2)) {
            while (!empty($this->stack1)) {
                $this->stack2[] = array_pop($this->stack1);
            }
        }
        return end($this->stack2);
    }
    /**
     * Returns whether the queue is empty.
     * @return Boolean
     */
    function empty() {
        return empty($this->stack1) && empty($this->stack2) ? true : false;
    }
}
												
											LeetCode#232-Implement Queue using Stacks-用栈实现队列的更多相关文章
- [LeetCode] 232. Implement Queue using Stacks 用栈来实现队列
		
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...
 - Leetcode 232 Implement Queue using Stacks 和 231 Power of Two
		
1. 232 Implement Queue using Stacks 1.1 问题描写叙述 使用栈模拟实现队列.模拟实现例如以下操作: push(x). 将元素x放入队尾. pop(). 移除队首元 ...
 - LeetCode 232 Implement Queue using Stacks
		
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...
 - (easy)LeetCode  232.Implement Queue using Stacks
		
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...
 - Java [Leetcode 232]Implement Queue using Stacks
		
题目描述: Implement the following operations of a queue using stacks. push(x) -- Push element x to the b ...
 - Leetcode 232 Implement Queue using Stacks STL
		
本题用两个栈实现队列,用栈的基本操作去实现队列的所有基本操作push(),pop(),peek()以及empty() sa作为输入栈,sb作为输出栈,将sa输入元素的反转过来放到sb中 push与sa ...
 - LeetCode 232 Implement Queue using Stacks 两个栈实现队列
		
class MyQueue { public: /** Initialize your data structure here. */ MyQueue() { } /** Push element x ...
 - 232 Implement Queue using Stacks 用栈来实现队列
		
使用栈来实现队列的如下操作: push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移除元素.peek() -- 返回队列首部的元素.empty() -- 返回队列是否为空.注意 ...
 - Java for LeetCode 232 Implement Queue using Stacks
		
Stack<Integer> stack=new Stack<Integer>(); public void push(int x) { stack.push(x); } // ...
 - LeetCode OJ:Implement Queue using Stacks(栈实现队列)
		
比较典型的一个题目,easy,不过可以有许多实现方式. 这里用的方式是每次pop完成之后再将stack2中的内容立即倒回stack1中.但是其他的实现也可以不是这样,可以是需要push的时候检查再,如 ...
 
随机推荐
- maven工程项目依赖爆红,手动导入依然缺少依赖
			
1.新建一个工程 2.把依赖添加到新建工程的pom文件 神奇的事情发生了,依赖自动补全!!! 3.点击install 安装一下可能有些依赖会有其他依赖 建议:不要在自己原来的工程上浪费时间,新建工程. ...
 - (五)mybatis-spring的集成
			
mybatis-spring的集成 源码下载(数据库使用derby,具体数据库结构参考这里) 在src下新建applicationContext.xml 配置内容:数据源.SqlSessionFact ...
 - OCR:慧眼读世界
			
作者:微软亚洲研究院首席研究员 霍强 把手机摄像头对准菜单上的法语菜名,屏幕上实时显示出翻译好的中文菜名:将全世界图书馆的藏书转化为电子书:街景车游走于大街小巷,拍摄街景的同时也从街景图像中自动提取文 ...
 - 吴裕雄--天生自然 R语言开发学习:分类(续一)
			
#-----------------------------------------------------------------------------# # R in Action (2nd e ...
 - SpringMVC之添加照片并修改照片名字
			
@RequestMapping(value="/addIdcardsSubmit",method={RequestMethod.POST,RequestMethod.GET}) p ...
 - 猫头鹰的深夜翻译:核心JAVA并发一
			
简介 从创建以来,JAVA就支持核心的并发概念如线程和锁.这篇文章会帮助从事多线程编程的JAVA开发人员理解核心的并发概念以及如何使用它们. (博主将在其中加上自己的理解以及自己想出的例子作为补充) ...
 - Google在百慕大避税几十亿美金,为什么巨头和富豪都会选百慕大避税?
			
为什么"越有钱越有钱"?为什么富豪只要不自己"作",就能让自己的财富疯狂增加?除了经营意识之外,关键他们还可以利用自己的资源.实力等去做很多看似让人不齿,但其实 ...
 - Center Loss - A Discriminative Feature Learning Approach for Deep Face Recognition
			
URL:http://ydwen.github.io/papers/WenECCV16.pdf这篇论文主要的贡献就是提出了Center Loss的损失函数,利用Softmax Loss和Center ...
 - water
			
webchacking.kr 第5题 打开题目发现了两个按钮,分别是Login和join 打开Login发现url是http://webhacking.kr/challenge/web/web-05/ ...
 - Java入门教程四(字符串处理)
			
Java 语言的文本数据被保存为字符或字符串类型.字符及字符串的操作主要用到 String 类和 StringBuffer 类,如连接.修改.替换.比较和查找等. 定义字符串 直接定义字符串 直接定义 ...