使用棧實現隊列的下列操做:php
示例:數組
MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false
說明:this
隊列是先進先出,棧是先進後出。因此能夠用兩個棧,新元素壓入棧的時候,先將棧中的元素彈出,放到另外一個棧中,把新元素壓入到棧的底部,再把另外一個棧的元素彈出,放回原棧中。此時,棧頂元素就是出隊時要先出的隊首元素。
code
這裏用的是數組表示隊列,空間複雜度O(n),時間複雜度分 push 和 pop ,前者是O(n),後者是O(1)。blog
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; } }
使用兩個棧,一個棧(stack1)僅負責入棧,一個棧(stack2)僅負責出棧。有新元素入隊時,直接將元素壓入 stack1 便可。但當出隊時,須要判斷 stack2 是否爲空,若是爲空,將 stack1 的元素依次出棧,壓入 stack2 中,隨後從 stack2 彈出,即爲出隊。但當 stack2 不爲空時,仍然直接從 stack2 出棧便可,知道 stack2 爲空時,纔可將 stack1 的元素拿出來放入 stack2 中。
隊列
這裏用的是數組表示隊列,空間複雜度O(n),時間複雜度分 push 和 pop ,前者是O(n),後者是O(1)。element
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; } }