浅谈PHP数据结构之队列

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素成为出队。因为队列只允许在一段插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表


在PHP中,队列经常用来做消息队列和任务队列等,是一个非常有用的机构。小弟初学,这里简单的介绍下队列的基本结构和操作。


1.顺寻队列

PHP中的顺序队列非常简单,简单的几行就能够实现。

<?php

class Queue{

private $Que=array();

//入队

public function Enqueue($data){

return array_push($this->Que,$data);

}

//出队

public function DelQue(){

return array_shift($this->Que);

}

}

>

这样就简单的实现了PHP版本的顺序队列。


2.链式队列

链式队列属于常用队列,这里我简单的写了一下链式队列的构造方法和基本操作:

<?php
//定义链式队列的成员
class Qnode{
public $data;//成员数据
public $next;//指向下一成员
public $id;//成员id
    public function __construct($data=NULL,$next=NULL,$id=0){
        $this->data=$data;
        $this->next=$next;
        $this->id=$id;
}
}
//定义队列
class LinkQueue{
    private $front;//队头
    private $rear;//队尾
    public function __construct(){
        $this->front=new Qnode($data=NULL,$next=NULL,$id=0);
        $this->rear=$this->front;
    }
    //定义入队
    public function EnQueue($data){
        $front=$this->front;
        $q = new Qnode($data,NULL,$this->rear->id+1);
        $this->rear->next=$q;
        $this->rear=$q;
    }
    //出队
    public function DelQueue(){
        $temp=$this->front->next->data;
        $this->front=$this->front->next;
        $this->front->data=NULL;
        return $temp;
    }
    //获取队列长度
    public function GetLength(){
        return ($this->rear->id-$this->front->id);
    }
    //获取队列
    public function GetLinkQueue(){
        $front=$this->front;
        while($front != $this->rear){
            $front=$front->next;
            echo '第'.$front->id.'个成员为'.$front->data.'<br>';
        }
    }
}

$a =new LinkQueue;
$a->Enqueue('a');
$a->Enqueue('b');
$a->Enqueue('c');
$a->Enqueue('d');
$a->Enqueue(3);
echo '出队以前总共有'.$a->GetLength().'个队员<br>';
echo $a->DelQueue().'执行出队以后<br>';
echo $a->GetLinkQueue();
echo '一共剩余'.$a->GetLength().'个队员';
?>

最后几行为测试代码,以下是结果:

希望可以帮助大家理解链表结构,小弟初学,要是有地方写的不够透彻,希望大家多多包含。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值