队列是一种特殊的线性表,它只允许在表的前端,可以称之为front,进行删除操作;而在表的后端,可以称之为rear进行插入操作。
队列和堆栈一样,是一种操作受限制的线性表,和堆栈不同之处在于:
队列是遵循“先进先出”原则,而堆栈遵循的是“先进后出”原则。
队列进行插入操作的端称为队尾,进行删除操作的称为队头,只允许在队尾进行插入操作,在队头进行删除操作。
队列的数据元素又称为队列元素,在队尾中插入一个元素称为入队,在队头删除一个元素称为出队。具体实现参考代码:
代码:
1 <?php 2 3 //php队列算法 4 class data 5 { 6 //数据 7 private $data; 8 9 public function __construct($data) 10 { 11 $this->data = $data; 12 echo $data . ":进队了!<br>"; 13 } 14 15 public function getData() 16 { 17 return $this->data; 18 } 19 20 public function __destruct() 21 { 22 echo $this->data . ":走了!<br>"; 23 } 24 } 25 26 class queue 27 { 28 protected $front;//队头 29 protected $rear;//队尾 30 protected $queue = array('0' => '队尾');//存储队列 31 protected $maxsize;//最大数 32 33 public function __construct($size) 34 { 35 $this->initQ($size); 36 } 37 38 //初始化队列 39 private function initQ($size) 40 { 41 $this->front = 0; 42 $this->rear = 0; 43 $this->maxsize = $size; 44 } 45 46 //判断队空 47 public function QIsEmpty() 48 { 49 return $this->front == $this->rear; 50 } 51 52 //判断队满 53 public function QIsFull() 54 { 55 return ($this->front - $this->rear) == $this->maxsize; 56 } 57 58 //获取队首数据 59 public function getFrontDate() 60 { 61 return $this->queue[$this->front]->getData(); 62 } 63 64 //入队 65 public function InQ($data) 66 { 67 if ($this->QIsFull()) { 68 echo $data . ":我一来咋就满了!(队满不能入队,请等待!)<br>"; 69 } else { 70 $this->front++; 71 for ($i = $this->front; $i > $this->rear; $i--) { 72 //echo $data; 73 if ($this->queue[$i]) { 74 unset($this->queue[$i]); 75 } 76 $this->queue[$i] = $this->queue[$i - 1]; 77 } 78 $this->queue[$this->rear + 1] = new data($data); 79 echo '入队成功!<br>'; 80 } 81 } 82 83 //出队 84 public function OutQ() 85 { 86 if ($this->QIsEmpty()) { 87 echo "队空不能出队!<br>"; 88 } else { 89 unset($this->queue[$this->front]); 90 $this->front--; 91 //print_r($this->queue); 92 //echo $this->front; 93 echo "出队成功!<br>"; 94 } 95 } 96 } 97 98 $q = new queue(2); 99 $q->InQ("queue1"); 100 $q->InQ('queue2'); 101 $q->InQ('queue3'); 102 $q->InQ('queue4'); 103 $q->OutQ(); 104 $q->InQ("queue5"); 105 $q->OutQ(); 106 $q->OutQ(); 107 $q->OutQ(); 108 $q->OutQ();
本案例中有两个类:
第一个是data类,用于实现数据的存放以及队列元素的入队出队情况;
第二个是queue类,用于队列元素的一些入队出队操作。
队列中包含四个属性:
front(队列的头部)
rear(队列的尾部)
maxsize(队列的长度,即队列元素个数)
queue(存放所有已入队队列元素的对象)
场景说明:
1.初始化队列时,生成一个队列,传入一个参数作为maxsize初始化队列把队尾rear设为0,队头front也设为0,此时queue中只有0号元素,并且rear和front都指向它。
2.入队时,先需要判断队列是否已满(front-rear == maxsize),如果已满不可在插入,如果未满则允许插入。
插入时,front自增,然后依次让队列所有元素向前移动一位(让出队尾位置以便插入新元素),然后生成新的data对象插入到队尾位置。
3.出队时,判断队列是否为空(front == rear),如果为空时,无法出队。如果不为空时,删除front指向的对象,并且front自减,完成出队。
运行结果如下:
queue1:进队了! 入队成功! queue2:进队了! 入队成功! queue3:我一来咋就满了!(队满不能入队,请等待!) queue4:我一来咋就满了!(队满不能入队,请等待!) queue1:走了! 出队成功! queue5:进队了! 入队成功! queue2:走了! 出队成功! queue5:走了! 出队成功! 队空不能出队! 队空不能出队!