画江湖之数据结构 [第二话:队列和栈] 队列

队列

1 队列简介

概括:

  • 队列是一种特殊的线性表(链表),特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作(FIFO),和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
  • 队列中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
    file

完整代码块

<?php 

class Node{
    public $data;
    public $next;

    public function __construct($data,$next=null){
        $this->data = $data;
        $this->next = $next;
    }
}

class Queue{
    public $front = null;
    public $rear = null;

    public $size = 0;

    public function __construct(){

    }

    public function push($data)
    {
        $n = new Node($data);
        if($this->front == null && $this->rear == null){
            $this->front = $n;
            $this->rear = $n;
        }else{
            $this->rear->next = $n;
            $this->rear  = $n;
        }
        $this->size++;
    }

    public function shift()
    {
        if($this->front){
            $this->size--;
            $data = $this->front->data;
            $this->front = $this->front->next;
            return $data;
        }else{
            return null;
        }
    }

}

// $s = new Queue();
// $s->push("aaaa");
// $s->push("bb");
// $s->push("cc");
// $s->push("dd");
// $s->push("fifo");

// // echo $s->shift();

// while($data = $s->shift()){
//  echo $data."<br>";
// }

//数组实现队列
// $arr = [];
// array_push($arr,"张三");
// array_push($arr,"李四");
// array_push($arr,"王五");
// array_push($arr,"王六");

// while($data  = array_shift($arr)){
//  echo $data."<br>";
// }

2 分析代码块 具体分析到代码注释哦 ~ 队列是先进先出的结构哦

先定义一个节点

class Node{
    public $data;
    public $next;

    public function __construct($data,$next=null){
        $this->data = $data;
        $this->next = $next;
    }
}

压入队列

public $front = null;//定义头部的变量
    public $rear = null;//定义尾部的变量

    public $size = 0;//定义队列的总长度

    public function push($data)
    {
        $n = new Node($data);//先定义一个对象
        if($this->front == null && $this->rear == null){ //如果头部和尾部都是为空的情况下
            $this->front = $n;//就把想压进去的队列初始化为头部队列
            $this->rear = $n;//就把想压进去的队列初始化为尾部队列
        }else{
            //记住:队列是在尾部插入 所以下面的操作是正常的。。
            $this->rear->next = $n;//第一步:尾部的下一个就是当前想插入的数值
            $this->rear  = $n;//第二步:尾部变成当前想插入的值
        }
        $this->size++;//队列计数
    }
    // $s = new Queue();
    // $s->push("aaaa");
    // $s->push("bb");
    // $s->push("cc");
    // $s->push("dd");

出队列

public function shift()
    {
        if($this->front){ //如果有头部队列 说明有值了 才可以出队列哦
            $this->size--;//减去队列的长度
            $data = $this->front->data;//从头部出一个队列的数据
            $this->front = $this->front->next;//把头部队列的数值 替换为他的下一个队列
            return $data;//返回数据
        }else{
            return null;
        }
    }
     while($data = $s->shift()){
    echo $data;
 }

3 利用php的自带的数组实现队列

代码段 和分析代码~

//数组实现队列
 $arr = [];//定义一个数组队列
 array_push($arr,"张三");//压入到队列尾部
 array_push($arr,"李四");
 array_push($arr,"王五");
 array_push($arr,"王六");

 while($data  = array_shift($arr)){//从头部弹出一个队列数据
    echo $data."<br>";
 }
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 1

谢谢分享,希望多多更新

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!