| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | <?php/** * A simple array-backed queue, based off of the classic Okasaki * persistent amortized queue.  The basic idea is to maintain two * stacks: an input stack and an output stack.  When the output * stack runs out, reverse the input stack and use it as the output * stack. * * We don't use the SPL implementation because it's only supported * on PHP 5.3 and later. * * Exercise: Prove that push/pop on this queue take amortized O(1) time. * * Exercise: Extend this queue to be a deque, while preserving amortized * O(1) time.  Some care must be taken on rebalancing to avoid quadratic * behaviour caused by repeatedly shuffling data from the input stack * to the output stack and back. */class HTMLPurifier_Queue {    private $input;    private $output;    public function __construct($input = array()) {        $this->input = $input;        $this->output = array();    }    /**     * Shifts an element off the front of the queue.     */    public function shift() {        if (empty($this->output)) {            $this->output = array_reverse($this->input);            $this->input = array();        }        if (empty($this->output)) {            return NULL;        }        return array_pop($this->output);    }    /**     * Pushes an element onto the front of the queue.     */    public function push($x) {        array_push($this->input, $x);    }    /**     * Checks if it's empty.     */    public function isEmpty() {        return empty($this->input) && empty($this->output);    }}
 |