zoukankan      html  css  js  c++  java
  • PHP 队列

    后进先出:LIFO
    先进先出:FIFO

    array_push — 将一个或多个单元压入数组的末尾(入栈)
    array_pop — 弹出数组最后一个单元(出栈)
    array_shift — 将数组开头的单元移出数组
    array_unshift — 在数组开头插入一个或多个单元

    堆和栈的区别主要有五大点,分别是:

    1、申请方式的不同。栈由系统自动分配,而堆是人为申请开辟;
    2、申请大小的不同。栈获得的空间较小,而堆获得的空间较大;
    3、申请效率的不同。栈由系统自动分配,速度较快,而堆一般速度比较慢;
    4、存储内容的不同。栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排;栈是连续的空间,而堆是不连续的空间。
    5、底层不同。栈是连续的空间,而堆是不连续的空间

    堆栈和队列都是特殊的线性表,差别是线性表的插入删除操作不受限制,而堆栈只能在栈顶删除和插入,队列只能在队尾插入,对头删除。堆栈可以用来完成数据元素序列的特定转换,队列可以用做数据元素序列的缓冲存储。

    堆栈:堆栈是一种特殊的线性表,堆栈的 数据元素以及数据元素之间的逻辑关系和线性表完全相同,只是线性表允许在任意位置插入和删除数据元素,而堆栈指是在固定的一端进行数据的插入和删除操作。

    堆栈允许进行数据元素插入和删除的一段称为栈顶,另一端成为栈尾。栈顶的当前位置是动态因为随时会插入数据和删除数据。堆栈是一种后进先出的操作方式。PS:任何支持递归算法的程序设计语言,都是借助堆栈来实现递归算法的。 

    队列: 

    1)队列(Queue)是一种先进先出(FIFO)的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头。即入队只能从队尾入,出队只能从队头出。
    2)队列一般拥有队首(front指针)和队尾(rear指针),当一个队列并未存入数据的时候,front和rear指针均指向队首。
    3)入队操作:rear后移,存入数据在rear指向的单元,队满不可入队,这同时也表明front总是指向队首元素的前驱。
    4)出队操作:front后移,元素出队,队空不可出队。

    入队:

    出队:

    使用SplQueue class实现 (扩展)

    https://www.php.net/manual/zh/class.splqueue.php

    class sqlQueue 
    {
        private $splQueue;
    
        public function __construct()
        {
            $this->splQueue = new SplQueue();
        }
    
        public function enqueue(string $data = null) 
        {
            $this->SplQueue->enqueue($data);
        }
    
        public function dequeue() 
        {
            return $this->sqlQueue->dequeue();
        }
    }

    使用函数实现

    class arrayQueue 
    {
        private $arrayQueue = [];
    
        public function push ($Str)
        {
            array_push($this->arrayQueue, $Str);
        }
    
        public function popp () 
        {
            return array_shift($this->arrayQueue);
        }
    
        public function dump () 
        {
            return $this->arrayQueue;
        }
    }
    
    $obj = new arrayQueue();
    
    $arrs = ['即' ,'元' ,'素' ,'可' ,'以' ,'在' ,'队' ,'列' ,'的' ,'任' ,'意' ,'一' ,'段' ,'入'];
    
    foreach ($arrs AS $v) 
    {
        $obj->push($v);
    }
    
    // echo"<pre>";
    
    // var_dump($obj->ec());
    
    // var_dump($obj->popp());
    // var_dump($obj->popp());
    // var_dump($obj->popp());
    // var_dump($obj->popp());
    
    // var_dump($obj->dump());

    双端队列

    // 双端队列
    class Deque 
    {
        public $queue_array = [];
    
        // 尾入
        public function EnterEnd($value)
        {
            return array_push($this->queue_array, $value);
        }
    
        // 尾出
        public function OutEnd() 
        {
            return array_pop($this->queue_array);
        }
    
        // 头入
        public function EnterHead($value) 
        {
            return array_unshift($this->queue_array, $value);
        }
    
        // 头出
        public function OutHead() 
        {
            return array_shift($this->queue_array);
        }
    
        // 清空队列
        public function QueueEmpty() 
        {
            unset($this->queue_array);
        }
    
        // 获取头
        public function getHead() 
        {
            return reset($this->queue_array);
        }
    
        // 获取尾
        public function getEnd() 
        {
            return end($this->queue_array);
        }
    
        // 获取长度
        public function getLength() 
        {
            return count($this->queue_array);
        }
    }
    class data {
        //数据
        private $data;
        public function __construct($data)
        {
            $this->data=$data;
            echo $data.":哥入栈了!<br>";
        }
    
        public function getData()
        {
            return $this->data;
        }
    
        public function __destruct()
        {
            echo $this->data.":哥走了!<br>";
        }
    }
    
    class stack 
    {
        private $size;
        private $top;
        private $stack=array();
        public function __construct($size)
        {
            $this->Init_Stack($size);
        }
    
        //初始化栈
        public function Init_Stack($size)
        {
            $this->size=$size;
            $this->top=-1;
        }
    
        //判断栈是否为空
        public function Empty_Stack()
        {
            if($this->top==-1)return 1;
            else return 0;
        }
    
        //判断栈是否已满
        public function Full_Stack()
        {
            if($this->top<$this->size-1)return 0;
            else return 1;
        }
        
        //入栈
        public function Push_Stack($data)
        {
            if($this->Full_Stack())echo "栈满了<br />";
            else $this->stack[++$this->top]=new data($data);
        }
    
        //出栈
        public function Pop_Stack()
        {
            if($this->Empty_Stack())echo "栈空着呢<br />";
            else unset($this->stack[$this->top--]);
        }
    
        //读取栈顶元素
        public function Top_Stack()
        {
            return $this->Empty_Stack()?"栈空无数据!":$this->stack[$this->top]->getData();
        }
    }
    $stack=new stack(4);
    $stack->Pop_Stack();
    $stack->Push_Stack("aa");
    $stack->Push_Stack("aa1");
    $stack->Pop_Stack("aa1");
    $stack->Push_Stack("aa2");
    $stack->Push_Stack("aa3");
    $stack->Push_Stack("aa4");
    echo $stack->Top_Stack(),'<br />';
    $stack->Push_Stack("aa5");
    $stack->Push_Stack("aa6");
    $stack->Pop_Stack();
    $stack->Pop_Stack();
    $stack->Pop_Stack();
    $stack->Pop_Stack();
    $stack->Pop_Stack();
    $stack->Pop_Stack();

    参考地址

    https://www.cnblogs.com/chenhaoyu/p/10731090.html

    https://segmentfault.com/a/1190000015307846

    https://github.com/xx19941215/light-tips

    https://www.php.net/manual/zh/class.splqueue.php

    https://www.cnblogs.com/itsuibi/p/10870608.html

    https://www.cnblogs.com/zhangmiaomiao/p/6013406.html

    https://zhuanlan.zhihu.com/p/92616538

    https://www.php.cn/php-weizijiaocheng-376068.html

    https://www.jb51.net/article/127318.htm

    https://www.jb51.net/article/127322.htm

    https://www.cnblogs.com/glory-jzx/archive/2012/04/25/2469163.html

    https://zhuanlan.zhihu.com/p/142042115

    https://www.php.cn/faq/416802.html

    https://blog.csdn.net/qq_36119192/article/details/84928672

  • 相关阅读:
    MYSQL触发器的使用
    数据库与信息系统经典例题
    【自考】数据结构第六章查找,期末不挂科指南,第10篇
    hdfs/hbase 程序利用Kerberos认证超过ticket_lifetime期限后异常
    mysql必知必会--MySQL简介
    启用CentOS6.5 64位安装时自带的MySQL数据库服务器
    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定
    redis的发布订阅
    使用ClouderaManager管理的HBase的RegionServer无法启动(启动失败)的问题
    mysql 的root 用户无法授权,navicat 远程授权提示1044解决方案
  • 原文地址:https://www.cnblogs.com/http-500/p/13710641.html
Copyright © 2011-2022 走看看