php队列实现匹配,PHP队列的实现详细操作步骤

队列是一种特殊的线性表,它只允许在表的前端,可以称之为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 . ":进队了!
";

13 }

14

15 public function getData()

16 {

17 return $this->data;

18 }

19

20 public function __destruct()

21 {

22 echo $this->data . ":走了!
";

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 . ":我一来咋就满了!(队满不能入队,请等待!)
";

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 '入队成功!
';

80 }

81 }

82

83 //出队 84 public function OutQ()

85 {

86 if ($this->QIsEmpty()) {

87 echo "队空不能出队!
";

88 } else {

89 unset($this->queue[$this->front]);

90 $this->front--;

91 //print_r($this->queue); 92 //echo $this->front; 93 echo "出队成功!
";

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等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值