数组实现bfs是用front/rear指针在一维静态数组中模拟队列,通过编号映射和邻接数组表示变量图,完成从起点x出发的正向传播遍历。

用数组实现广度优先搜索(BFS)本质上是用一维数组模拟队列,不依赖链表或语言内置队列结构;关键在于维护两个指针:头指针(front)指向待处理节点,尾指针(rear)指向下一个空闲插入位置。遍历变量图(如程序中变量间赋值、引用关系构成的有向图)时,需先将图转为邻接表或邻接数组形式,再用数组队列驱动BFS。
用静态数组模拟队列
设定固定大小的数组 queue[MaxN],初始 front = rear = 0。入队即 queue[rear++] = node,出队即 node = queue[front++]。注意判断队列空(front == rear)与满(rear == MaxN),实际用于BFS时,若图节点数 ≤ MaxN,不会溢出。
- 无需动态内存分配,适合嵌入式或教学场景
- 出队不真正删除元素,仅移动 front,空间复用高效
- 可加一个 size 变量辅助判断,但非必需
构建变量图的邻接数组表示
变量图中每个节点是变量名(如 a、b),边表示依赖关系(如 a = b + c ⇒ a 依赖 b 和 c,即存在边 b → a、c → a)。为用数组BFS,需预处理:
- 对所有变量做编号映射(如哈希表:{"a":0, "b":1, "c":2})
- 构建 adj[N][deg_max]:每行存该节点的邻居编号;或更省内存的 edges[] 数组 + head[N] 偏移数组(链式前向星)
- 记录每个节点的出度,避免遍历无效位置
数组BFS遍历变量图的完整步骤
以“找出从变量 x 出发所有被它直接影响或间接影响的变量”为例(正向传播分析):
- 将起点 x 编号入队:queue[rear++] = idx_x,标记 visited[idx_x] = true
- 当 front 时循环:取 u = queue[front++],遍历其所有邻接点 v(即所有被 u 影响的变量)
- 对每个未访问的 v,设 visited[v] = true,并入队:queue[rear++] = v
- 过程中可收集路径、层级、影响链等信息(如记录 level[v] = level[u] + 1)
实战小例子:三变量赋值图
语句:b = a; c = b; d = a + c。变量集 {a,b,c,d} → 编号 {0,1,2,3}。依赖边为:a→b, b→c, a→d, c→d。邻接数组表示为:
adj[0] = [1, 3] // a → b, d<br>adj[1] = [2] // b → c<br>adj[2] = [3] // c → d<br>adj[3] = [] // d 无出边
从 a(0) 开始BFS:入队0 → 出队0,入1、3 → 出队1,入2 → 出队3(无新节点)→ 出队2,入3(已访问,跳过)。最终访问序列为 [0,1,3,2],覆盖全部变量,体现影响传播顺序。










