File indexing completed on 2024-12-22 05:36:22
0001 <?php 0002 0003 /** 0004 * A simple array-backed queue, based off of the classic Okasaki 0005 * persistent amortized queue. The basic idea is to maintain two 0006 * stacks: an input stack and an output stack. When the output 0007 * stack runs out, reverse the input stack and use it as the output 0008 * stack. 0009 * 0010 * We don't use the SPL implementation because it's only supported 0011 * on PHP 5.3 and later. 0012 * 0013 * Exercise: Prove that push/pop on this queue take amortized O(1) time. 0014 * 0015 * Exercise: Extend this queue to be a deque, while preserving amortized 0016 * O(1) time. Some care must be taken on rebalancing to avoid quadratic 0017 * behaviour caused by repeatedly shuffling data from the input stack 0018 * to the output stack and back. 0019 */ 0020 class HTMLPurifier_Queue { 0021 private $input; 0022 private $output; 0023 0024 public function __construct($input = array()) { 0025 $this->input = $input; 0026 $this->output = array(); 0027 } 0028 0029 /** 0030 * Shifts an element off the front of the queue. 0031 */ 0032 public function shift() { 0033 if (empty($this->output)) { 0034 $this->output = array_reverse($this->input); 0035 $this->input = array(); 0036 } 0037 if (empty($this->output)) { 0038 return NULL; 0039 } 0040 return array_pop($this->output); 0041 } 0042 0043 /** 0044 * Pushes an element onto the front of the queue. 0045 */ 0046 public function push($x) { 0047 array_push($this->input, $x); 0048 } 0049 0050 /** 0051 * Checks if it's empty. 0052 */ 0053 public function isEmpty() { 0054 return empty($this->input) && empty($this->output); 0055 } 0056 }