* 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