队列是一种特殊的线性表,它只允许在表的前端,可以称之为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:走了!
出队成功!
队空不能出队!
队空不能出队!
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里 PHP进阶架构师>>>实战视频、大厂面试文档免费获取