栈的两种遍历方式

本文介绍了栈的两种遍历方法:普通遍历与递归遍历,并通过实例代码展示了如何实现这两种遍历方式。通过对比,文章揭示了递归遍历的关键在于找到递归出口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、普通遍历

    public void test05(){
        MyLinkedStack<String> myStack = new MyLinkedStack<String>();
        myStack.push("1");
        myStack.push("2");
        myStack.push("3");
        myStack.push("4");
        //如果这么写会出现问题
        int x = myStack.length();
        for(int i = 0; i < x; i++){
            System.out.print(myStack.pop()+" ");
        }
    }

二、递归遍历

    //测试栈的递归遍历
    @Test
    public void test04(){
        MyLinkedStack<String> myStack = new MyLinkedStack<String>();
        myStack.push("1");
        myStack.push("2");
        myStack.push("3");
        myStack.push("4");
        //深度优先遍历
        dfs(myStack);

    }

    //深度优先遍历
    public void dfs(MyLinkedStack<String> myStack){
        if(myStack.length() == 0){
            return ;
        }
        System.out.print(myStack.pop()+" ");
        dfs(myStack);
    }

一开始我觉得栈的递归遍历有多么高深,其实递归最重要的是找到一个递归出口。

<think>嗯,用户想了解图的深度优先搜索(DFS)和广度优先搜索(BFS)算法。用户的问题非常明确,直接指向图论中的两种基础遍历算法。从引用内容看,用户可能正在学习数据结构或算法相关课程,需要清晰的算法解释和对比。用户提供的系统级指令要求严格遵循LaTeX格式和中文回答规范。特别要注意数学表达式的格式要求:行内公式用$...$,独立公式用$$...$$。同时需要生成相关问题,并在引用处自然标注。关于DFS和BFS的核心差异:-DFS强调"深度"优先,类似树的先序遍历,使用结构(递归或显式)-BFS强调"广度"优先,类似树的层序遍历,使用队列结构两种算法的时间复杂度都是$O(|V|+|E|)$,但空间复杂度差异显著,这在引用[1][2][3][4]中都有印证需要特别注意算法步骤的准确性。根据引用[2][4],DFS的递归实现需要标记已访问顶点,而BFS必须使用队列管理待访问节点。用户提供的引用[3]特别强调了DFS"走到底再回溯"的特性,这应该在解释中突出。对于应用场景的说明,引用[1]提到"状态空间不大"时适用,但实际应用中DFS在拓扑排序、环路检测等方面更优,BFS则擅长最短路径问题。这些补充信息能帮助用户建立实用认知。最后生成的问题要围绕算法延伸:复杂度分析(用户引用未涉及)、代码实现细节(引用中有示例结构)、实际应用案例等。特别要避免生成与现有引用重复的问题。</think>### 图的深度优先搜索(DFS)与广度优先搜索(BFS) #### **一、深度优先搜索(DFS)** **核心思想**:类似树的先序遍历,从起始顶点 $v$ 出发,沿一条路径递归深入,直到无法继续前进时回溯,探索其他分支。 **算法步骤**: 1. 访问顶点 $v$,标记为已访问。 2. 遍历 $v$ 的所有邻接点 $w$: - 若 $w$ 未访问,则递归调用 DFS($w$)。 **特点**: - 使用****(递归隐式或显式)实现。 - 空间复杂度:$O(|V|)$(顶点数)。 - 适用场景:拓扑排序、连通分量检测、路径存在性判断[^3][^4]。 **伪代码**(递归实现): ```python def DFS(v, visited): visited[v] = True # 标记访问 print(v) # 处理顶点 for w in graph[v]: # 遍历邻接点 if not visited[w]: DFS(w, visited) # 递归深入 ``` --- #### **二、广度优先搜索(BFS)** **核心思想**:类似树的层序遍历,从起始顶点 $v$ 出发,逐层访问邻接点,使用队列管理待访问节点。 **算法步骤**: 1. 初始化队列 $Q$,将 $v$ 入队并标记。 2. 当 $Q$ 非空时: - 出队顶点 $u$,访问 $u$。 - 将 $u$ 的所有**未访问邻接点**入队并标记。 **特点**: - 使用**队列**实现。 - 空间复杂度:$O(|V|)$(最坏情况)。 - 适用场景:无权图最短路径、社交网络层级扩散[^1][^4]。 **伪代码**: ```python def BFS(v, visited): queue = deque([v]) visited[v] = True while queue: u = queue.popleft() print(u) # 处理顶点 for w in graph[u]: # 遍历邻接点 if not visited[w]: visited[w] = True queue.append(w) ``` --- #### **三、DFS与BFS对比** | **特性** | **DFS** | **BFS** | |------------------|--------------------------|--------------------------| | **数据结构** | 递归/显式) | 队列 | | **解的性质** | 不一定最短路径 | 无权图最短路径 | | **空间开销** | 路径深度相关 | 最大邻接层宽度相关 | | **典型应用** | 回溯问题、环路检测 | 最短路径、状态层级遍历 | > **关键差异**: > - DFS 优先探索深度方向,可能更快找到深层目标; > - BFS 按层扩散,确保首次到达目标时为最短路径(无权图)[^2][^4]。 --- #### **四、示例分析** 假设图 $G$ 如下(邻接表表示): ``` 0: [1, 2] 1: [0, 3] 2: [0, 4] 3: [1] 4: [2] ``` - **DFS 遍历序列**(从顶点 0 开始):$0 \to 1 \to 3 \to 2 \to 4$ - **BFS 遍历序列**(从顶点 0 开始):$0 \to 1 \to 2 \to 3 \to 4$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值