后进先出: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