PHP隊列的實現詳細操做步驟

隊列是一種特殊的線性表,它只容許在表的前端,能夠稱之爲front,進行刪除操做;而在表的後端,能夠稱之爲rear進行插入操做。隊列和堆棧同樣,是一種操做受限制的線性表,和堆棧不一樣之處在於:隊列是遵循「先進先出」原則,而堆棧遵循的是「先進後出」原則。隊列進行插入操做的端稱爲隊尾,進行刪除操做的稱爲隊頭,只容許在隊尾進行插入操做,在隊頭進行刪除操做。php


隊列的數據元素又稱爲隊列元素,在隊尾中插入一個元素稱爲入隊,在隊頭刪除一個元素稱爲出隊。具體實現參考代碼:前端

代碼:算法

 1 <?php
 2 /**
 3 * php隊列算法
 4 * Author Been
 5 * QQ:281443751
 6 * Email:binbin1129@126.com
 7 **/
 8 class data {
 9   //數據
10   private $data;
11 
12   public function __construct($data){
13     $this->data=$data;
14     echo $data.":哥進隊了!<br>";
15   }
16 
17   public function getData(){
18     return $this->data;
19   }
20   public function __destruct(){
21     echo $this->data.":哥走了!<br>";
22   }
23 }
24 class queue{
25   protected $front;//隊頭
26   protected $rear;//隊尾
27   protected $queue=array('0'=>'隊尾');//存儲隊列
28   protected $maxsize;//最大數
29 
30   public function __construct($size){
31     $this->initQ($size);
32   }
33   //初始化隊列
34   private function initQ($size){
35     $this->front=0;
36     $this->rear=0;
37     $this->maxsize=$size;
38   }
39   //判斷隊空
40   public function QIsEmpty(){
41     return $this->front==$this->rear;
42   }
43   //判斷隊滿
44   public function QIsFull(){
45     return ($this->front-$this->rear)==$this->maxsize;
46   }
47   //獲取隊首數據
48   public function getFrontDate(){
49     return $this->queue[$this->front]->getData();
50   }
51   //入隊
52   public function InQ($data){
53     if($this->QIsFull())echo $data.":我一來咋就滿了!(隊滿不能入隊,請等待!)<br>";
54     else {
55       $this->front++;
56       for($i=$this->front;$i>$this->rear;$i--){
57         //echo $data;
58         if($this->queue[$i])unset($this->queue[$i]);
59         $this->queue[$i]=$this->queue[$i-1];
60       }
61       $this->queue[$this->rear+1]=new data($data);
62       //print_r($this->queue);
63       //echo $this->front;
64       echo '入隊成功!<br>';
65     }
66   }
67   //出隊
68   public function OutQ(){
69     if($this->QIsEmpty())echo "隊空不能出隊!<br>";
70     else{
71       unset($this->queue[$this->front]);
72       $this->front--;
73       //print_r($this->queue);
74       //echo $this->front;
75       echo "出隊成功!<br>";
76     }
77   }
78 }
79 $q=new queue(3);
80 $q->InQ("小苗");
81 $q->InQ('馬帥');
82 $q->InQ('溜冰');
83 $q->InQ('張世佳');
84 $q->OutQ();
85 $q->InQ("周瑞曉");
86 $q->OutQ();
87 $q->OutQ();
88 $q->OutQ();
89 $q->OutQ();

 

本案例中有兩個類:後端

 第一個是data類,用於實現數據的存放以及隊列元素的入隊出隊狀況;this

  第二個是queue類,用於隊列元素的一些入隊出隊操做。spa

隊列中包含四個屬性:code

front(隊列的頭部)對象

  rear(隊列的尾部)blog

  maxsize(隊列的長度,即隊列元素個數)隊列

  queue(存放全部已入隊隊列元素的對象)

場景說明:

1.初始化隊列時,生成一個隊列,傳入一個參數做爲maxsize初始化隊列把隊尾rear設爲0,隊頭front也設爲0,此時queue中只有0號元素,而且rear和front都指向它。

2.入隊時,先須要判斷隊列是否已滿(front-rear == maxsize),若是已滿不可在插入,若是未滿則容許插入。插入時,front自增,而後依次讓隊列全部元素向前移動一位(讓出隊尾位置以便插入新元素),而後生成新的data對象插入到隊尾位置。

3.出隊時,判斷隊列是否爲空(front == rear),若是爲空時,沒法出隊。若是不爲空時,刪除front指向的對象,而且front自減,完成出隊。

運行結果以下:

小苗:哥進隊了!
 入隊成功
 馬帥:哥進隊了!
 入隊成功
 溜冰:哥進隊了!
 入隊成功
 張世佳:我一來咋就滿了!(隊滿不能入隊,請等待!)
 小苗:哥走了!
 出隊成功!
 周瑞曉:哥進隊了!
 入隊成功
 馬帥:哥走了!
 出隊成功!
 溜冰:哥走了!
 出隊成功!
 周瑞曉:哥走了!
 出隊成功!
 隊空不能出隊!
 隊空不能出隊!
相關文章
相關標籤/搜索