当前位置: 首页 > 后端技术 > PHP

队列的数据结构

时间:2023-03-29 15:12:54 PHP

介绍队列是一个有序队列,可以用数组或者链表来实现。它遵循先进先出的原则,即队列中先存入的数据必须先取出,后存入的数据必须后取出。数组模拟队列1。需要一个最大容量maxSize.2。定义两个变量front和rear,front会随着数据的输出而变化,rear会随着数据的输入而变化。将数据存入队列1.将尾指针向后移动:$rear+1.将$rear==$front,队列为空;2、如果尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear指向的数组元素中。rear==maxSize-1,队列已满。代码实现:maxSize=$maxSize;$this->front=-1;$this->rear=-1;$this->arr=[];}//显示队列数据publicfunctionshowQueue(){for($i=$this->front+1;$i<=$this->rear;$i++){echo$this->arr[$i].'';}}//插入数据publicfunctionpush($value){if($this->isFull()){thrownew\Exception('队列已满');}$this->rear++;$this->arr[$this->rear]=$value;}//弹出数据publicfunctionpop(){if($this->isEmpty()){thrownew\Exception('队列为空');}$this->front++;}//判断队列是否为空publicfunctionisEmpty(){return$this->front==$this->rear;}//判断队列是否满publicfunctionisFull(){return$this->rear==$this->maxSize-1;}}$arr=newArrayQueue(10);$arr->push(2);$arr->push(2);$arr->push(2);$arr->push(2);$arr->pop();$arr->showQueue();上述队列是有缺陷的。当队列满了,数据就会弹出,不能再插入数据,所以做了一个循环队列来完善功能。数组模拟循环队列思想:1.rear指向队列尾部的最??后一个位置,并约定留一个空格;2.front指向队头;3.当rear=front时,队列为空;4.当front==(rear+1)%maxSize时,队列已满;5、队列长度为:(rear+maxSize-front)%maxSize;classCircleArray{protected$maxSize;受保护的$前面;受保护的$rear;//rear指向最后一个元素,最后一个元素//front指向第一个元素//如果rear=front,则队列为空//if(rear+1)%maxSize=front,则队列已满//队列长度(rear+maxSize-front)%maxSizepublicfunction__construct($maxSize){$this->maxSize=$最大尺寸;$this->front=0;$this->rear=0;$this->arr=[];}//显示队列数据publicfunctionshowQueue(){if($this->isEmpty()){thrownew\Exception('队列为空');}for($i=$this->front;$i<=$this->length();$i++){echo$this->arr[$i%$this->maxSize].'';}}//插入数据publicfunctionpush($value){if($this->isFull()){thrownew\Exception('队列已满');}$this->arr[$this->rear]=$value;$this->rear=($this->rear+1)%$this->maxSize;}//弹出数据publicfunctionpop(){if($this->isEmpty()){thrownew\Exception('队列为空');}$this->front=($this->front+1)%$this->maxSize;}//判断队列是否为EmptypublicfunctionisEmpty(){return$this->front==$this->rear;}//判断队列是否满publiccfunctionisFull(){return($this->rear+1)%$this->maxSize==$this->front;}}//计算队列的长度publicfunctionlength(){return($this->rear+$this->maxSize-$this->front)%$this->maxSize;}}$arr=newCircleArray(5);$arr->push(2);$arr->push(2);$arr->push(2);$arr->push(2);$arr->pop();$arr->push(2);$arr->showQueue();