数据结构作业:递归与非递归算法解决数字拆分与八皇后问题

版权申诉
5星 · 超过95%的资源 19 下载量 146 浏览量 更新于2024-09-09 1 收藏 38KB DOCX 举报
"数据结构第2次作业-2020版.docx" 这篇作业主要涵盖了数据结构中的两个重要概念——栈和队列,并涉及到实际编程应用。首先,我们需要理解栈和队列的基本特性。栈是一种“后进先出”(LIFO)的数据结构,常用于递归和回溯等问题中;而队列则是一种“先进先出”(FIFO)的数据结构,常见于任务调度和缓冲区管理。 作业中的第一个编程任务是输入一个非零正整数,输出其各位数字,间隔至少一个空格。对于这个问题,我们可以使用两种方法:递归和非递归(利用堆栈)。递归解决方案通常会将数字转换为字符串,然后逐个字符处理。非递归方案,我们可以通过遍历整数,将其除以10的余数作为当前位数字,然后将整数除以10来移除已处理的位,直到整数变为0。为了实现非递归方案,我们可以使用一个堆栈,每次将整数除以10的余数压入堆栈,然后反向输出堆栈中的元素。 第二个编程题目是解决八皇后问题,这是一个经典的回溯算法问题。目标是在8x8的棋盘上放置8个皇后,使得没有两个皇后在同一行、同一列或同一对角线上。初始时,我们在第一行放置一个皇后,然后递归地尝试在下一行放置皇后,同时检查是否满足条件。如果无法放置,就回溯到上一行,改变当前行的皇后位置。在这个过程中,堆栈可以用来存储每行的皇后位置,以便回溯。给出的代码使用了递归实现,但要求消除递归,这通常可以通过将递归转化为迭代并使用堆栈来实现。在迭代过程中,我们模拟递归调用的状态,当尝试放置皇后时,将当前状态(包括皇后的位置和已尝试的行)压入堆栈,直到找到一个解决方案或遍历完所有可能的行。 此外,作业还涉及到了字符串操作,虽然具体内容未给出,但可以推测是要求实现一个字符串替换功能,将主串中的某个子串替换为另一个子串。这通常可以通过遍历主串,查找子串出现的位置,然后用新子串替换,并更新主串的相应部分来完成。 这份作业深入探讨了数据结构中的核心概念,以及如何在实际编程中运用这些概念,尤其是递归和非递归算法的设计,以及堆栈在解决复杂问题中的作用。通过完成这样的作业,学生能够加深对数据结构的理解,提高编程能力和问题解决技巧。
2265 浏览量
西南交大;西南交通大学;数据结构;赵宏宇;一、二叉树(二) 1. 写算法 (1) 二叉树的直径定义为从根结点至叶子的最大路径长度。编写算法,求二叉树(二叉链表)的直径。 (2) 已知二叉树(二叉链表)根结点指针bt,树中两个结点的指针p、q。编写算法求距离结点*p和*q最近的公共祖先的地址。 (3) 已知二叉树(二叉链表)根结点指针bt,利用二叉树叶子结点的rchild指针域将所有叶子结点从左向右连接成一个单向链表。算法返回单向链表头结点指针(即最左边第1个叶子结点的地址)。 2. 编程题 (1) 从键盘输入一个字符串(要求字符串中无重复字符),将串中字符当做完全二叉树的顺序存储结构,建立对应的完全二叉树的二叉链表存储结构,输出先、中、后序遍历结果。 (2) 用先序遍历法建立二叉树二叉链表存储结构(结点数据域类型为char,输入字符序列用字符'#'表示NULL),实现中序线索化,并用非递归算法输出中序遍历结果的正序和逆序序列。 二、图 1. 已知某无向图如下图所示。画出该图的多重邻接表存储结构示意图。根据该存储结构,写出从顶点v0出发,深度和宽度优先遍历顶点访问次序。 2. 写一个算法,判断无向图是否有环。算法提要:深度优先遍历过程中,访问某顶点后,该顶点的邻接点中有已访问的顶点且该已访问邻接点不是该顶点的上一级递归出发顶点(即存在回边),则有环。 3. 编程题: 建立无向图邻接表存储结构,输出深度和宽度优先遍历顶点访问次序。 4. 编程题:建立AOE网络存储结构,计算并输出ve[]和vl[]。 5. 选作题*:算法设计-已知AOE网络的邻接表存储结构G,ve[]和vl[]值已全部求取,写出算法,输出所有关键路径。要求每条关键路径用源点至汇点的顶点序列(拓扑有序)表示。