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

  • 相关阅读:
    UVALive 7141 BombX
    CodeForces 722D Generating Sets
    CodeForces 722C Destroying Array
    CodeForces 721D Maxim and Array
    CodeForces 721C Journey
    CodeForces 415D Mashmokh and ACM
    CodeForces 718C Sasha and Array
    CodeForces 635C XOR Equation
    CodeForces 631D Messenger
    田忌赛马问题
  • 原文地址:https://www.cnblogs.com/http-500/p/13710641.html
Copyright © 2011-2022 走看看