队列和栈都是线性数据结构,它们一个是先进先出,一个是先进后出,有着不同的使用场景。这两个数据结构基于链表,也可以用数组模拟这样的数据结构,通过 C++ 中 STL 提供的容器也可以更加方便快捷地实现。
队列
队列 (queue) 是在一端插入另一段删除的线性表,遵循先进先出,类似于排队,可以称为先进先出 (FIFO) 表。队列中,允许入队 (enqueue) 的一端为队尾,允许出队 (dequeue) 的一端为队头。以后的广度优先搜索就会用到它。
队列和栈都是线性数据结构,它们一个是先进先出,一个是先进后出,有着不同的使用场景。这两个数据结构基于链表,也可以用数组模拟这样的数据结构,通过 C++ 中 STL 提供的容器也可以更加方便快捷地实现。
队列 (queue) 是在一端插入另一段删除的线性表,遵循先进先出,类似于排队,可以称为先进先出 (FIFO) 表。队列中,允许入队 (enqueue) 的一端为队尾,允许出队 (dequeue) 的一端为队头。以后的广度优先搜索就会用到它。
这不,刚学完深搜没多久,又来写广搜笔记了(话说我队列笔记还没来得急写呢)。广度优先搜索,广搜,英文为Breadth First Search,简称 BFS。是从一个结点向其他方向的结点不断扩散,如同一道水晕在湖面上荡漾开来。主要可以用来找路径权值一定的最短路径。
深搜可以用到队列先进先出的特性。当一个结点准备扩散时,即弹出队列,再将接下来扩散到结点加入队列。随后按照队首扩散、弹出,不断循环。这也是叫它广度优先搜索的原因。
链表类似于数组,与数组不同的是,链表可以更加方便地更改数据和删除数据。数组若想将中间的数据删除,则要非很大功夫,而链表就不同了,它的操作更加简单一些(后面说)。
链表的数据组可以叫做“结点”,结点分成两个部分:一个是数据域,一个是指针域,数据域存数据,指针域指向下一个结点的数据地址。正是指针域将链表的每一个结点连在了一起。这种特性有一个好处:内存地址可以不连续,而数组的内存地址是必须要连续的。
比如内存还有 2GB 空闲,我申请了一个 1GB 大的数组,理论上是可以申请下来的,但占用的内存不一定完全是连续的。假设内存被一大堆东西占用的零零碎碎:确实有 2GB,但分成 4 个 500MB,这就申请不下来。而链表呢,可以充分利用内存碎片,通过指针变量,将分开的数据连在一起。