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