由2个栈组成的队列

* DoubleStacksQueue.php

<?php
/**
 * 由2个栈组成的队列
 * 1. 如果stackPush要往stackPop中压入数据, 那么必须一次性把stackPush中的数据全部压入
 * 2. 如果stackPush不为空, stackPush绝对不能向stackPop中压入数据
 */
namespace ds\stack;

class DoubleStacksQueue {
    /*** @var \SplStack 压入栈 */
    protected $stackPush;

    /*** @var \SplStack 弹出栈 */
    protected $stackPop;

    public function __construct() {
        $this->stackPush = new \SplStack();
        $this->stackPop = new \SplStack();
    }

    /**
     * 入队
     * @param $pushInt
     */
    public function enqueue($pushInt) {
        $this->stackPush->push($pushInt);
    }

    /**
     * 出队
     * @return mixed
     */
    public function dequeue() {
        if ($this->stackPop->isEmpty() && $this->stackPush->isEmpty()) {
            throw new \RuntimeException("Queue is empty!");
        }
        if ($this->stackPop->isEmpty()) {
            while (!$this->stackPush->isEmpty()) {
                $this->stackPop->push($this->stackPush->pop());
            }
        }
        return $this->stackPop->pop();
    }

    /**
     * 队首元素
     * @return mixed
     */
    public function front() {
        if ($this->stackPop->isEmpty() && $this->stackPush->isEmpty()) {
            throw new \RuntimeException("Queue is empty!");
        }
        if ($this->stackPop->isEmpty()) {
            while (!$this->stackPush->isEmpty()) {
                $this->stackPop->push($this->stackPush->pop());
            }
        }
        return $this->stackPop->top();
    }
}

* index.php

<?php
/**
 * Created by PhpStorm.
 * User: Mch
 * Date: 9/24/18
 * Time: 9:09 AM
 */
include './DoubleStacksQueue.php';

$q = new \ds\stack\DoubleStacksQueue();
$q->enqueue(3);
$q->enqueue(4);
$q->enqueue(5);
$q->enqueue(1);
$q->enqueue(2);
$q->enqueue(1);
$q->dequeue();
echo $q->front().PHP_EOL;

4

http://php.net/manual/ja/class.splqueue.php

猜你喜欢

转载自blog.csdn.net/fareast_mzh/article/details/82826975