PHP 用栈实现队列

PHP 用栈实现队列

author: he xiaodong date: 2020-05-04
用栈实现队列

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

  • push(x) – 将一个元素放入队列的尾部。
  • pop() – 从队列首部移除元素。
  • peek() – 返回队列首部的元素。
  • empty() – 返回队列是否为空。 示例: ```php 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 操作)。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-queue-using-stacks

##### 解题思路
定义两个栈,一个输入栈,一个输出栈,输入栈保存输入的内容,然后输出栈是输入栈逆序之后的数据,输出栈直接采用正常栈的操作就行,反正已经逆序了。


**PHP 实现**
```php
class MyQueue {
    private $inStack;
    private $outStack;

    /**
     * Initialize your data structure here.
     */
    function __construct() {
        $this->inStack = new SplStack();
        $this->outStack = new SplStack();
    }

    /**
     * Push element x to the back of queue.
     * @param Integer $x
     * @return NULL
     */
    function push($x) {
        $this->inStack->push($x);
    }

    /**
     * Removes the element from in front of queue and returns that element.
     * @return Integer
     */
    function pop() {
        if ($this->outStack->isEmpty()) {
            $this->shift();
        }

        return $this->outStack->pop();
    }

    /**
     * Get the front element.
     * @return Integer
     */
    function peek() {
        if ($this->outStack->isEmpty()) {
            $this->shift();
        }

        return $this->outStack->top();
    }

    private function shift()
    {
        while (!$this->inStack->isEmpty()) {
            $this->outStack->push($this->inStack->pop());
        }
    }

    /**
     * Returns whether the queue is empty.
     * @return Boolean
     */
    function empty() {
        return $this->inStack->isEmpty() && $this->outStack->isEmpty();
    }
}

/**
 * Your MyQueue object will be instantiated and called as such:
 * $obj = MyQueue();
 * $obj->push($x);
 * $ret_2 = $obj->pop();
 * $ret_3 = $obj->peek();
 * $ret_4 = $obj->empty();
 */