数据结构解析 堆栈、队列、数组
有个姑娘问我借钱去整容,整的挺成功,我再没认出是谁问我借的钱。
堆:
堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。
<?php
$heap = new SplMinHeap();
$heap->insert('data8');//入堆
$heap->insert('data9');//入堆
$heap->insert('data10');//入堆
echo $heap->extract().PHP_EOL;//从堆中提取数据
echo $heap->extract().PHP_EOL;//从堆中提取数据
echo $heap->extract().PHP_EOL;//从堆中提取数据
栈:(先进后出)
又名堆栈,是一种运算受限的线性表。只允许在栈顶插入和删除元素。栈顶是低位,栈底是高位。栈中没有元素时称为空栈,栈符合先进后出原则(LIFO,last in first out)。
实质:线性表
操作: push 、pop
$stack = new SplStack();
$stack->push('data1');//入栈(先进后出)
$stack->push('data2');//入栈
$stack->push('data3');//入栈
echo $stack->pop();//出栈
echo $stack->pop();//出栈
echo $stack->pop();//出栈
队列:(先进先出)
也是一种运算受限的线性表。 特殊之处在于它只允许在队列的前端(front,队头)进行删除操作,而在队列的后端(rear,队尾)进行插入操作。当队列中没有元素时,即front=rear,称为空队列。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。队列符合先进先出(FIFO—first in first out)原则。
实质:线性表
<?php
$queue = new SplQueue();
$queue->enqueue('data4');//入队列
$queue->enqueue('data5');//入队列
$queue->enqueue('data6');//入队列
echo $queue->dequeue();//出队列
echo $queue->dequeue();//出队列
echo $queue->dequeue();//出队列
echo $queue->dequeue();//出队列
数组:
固定数组(不论使不使用,都会分配相应的内存空间)
<?php
$array = new SplFixedArray(15);
$array['0'] = 54;
$array['6'] = 69;
$array['10'] = 32;
print_r($array);
内存的中的堆和栈
堆:堆是在程序运行时,而不是在程序编译时,申请的某个大小的内存空间。即动态分配的内存,对其访问和对一般内存的访问没有区别。堆是应用程序在运行的时候请求操作系统分配给自己的内存,一般是申请/给予的过程,一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。