第三次数据结构作业

博客包含五道算法题,有连续线段、猴子选大王、多项式相乘、文件加密(环)和词频统计。连续线段用floyd跑最长路;猴子选大王可递推或用单向循环链表;多项式相乘维护有序链表合并同类项;文件加密(环)组合链表操作;词频统计用有序链表按字典序排列。

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

###A.连续线段
####题目描述
给定若干个线段,求最多的首尾相连的线段条数,线段<=100

####题目解决
我其实不太知道这道题目用现在的知识应该怎么解??
写了个最短(长)路算法,floyd那种的,怎么抽象这个模型呢,就是把每一个线段都抽象成图论模型中的一个点,如果两条线段首尾相连就给他们俩中间连一条边长为1的边,然后用floyd跑一个最长路,枚举开始和结束的两个线段,然后找到最长路最长的一组,最长路长度+1输出就是本题的答案了
另:为什么会想到floyd呢,因为floyd是一个O(n3)O(n^3)O(n3)的算法,看到线段数<=100自然而然的就想到了

###B.猴子选大王
####题目描述
要从n只猴子中选出一位大王。它们决定使用下面的方法:
n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。

####题目解决
我记得去年上机题有类似的,还比这个简单
我写的递推,具体方法可以看TCPL串讲递推部分的内容,这个就是从q开始查数,实际上最后得出答案之后+q再模n就行了。
说说应该是本来应该写的算法吧,维护一条长度为n的单向循环链表,从链表第q个开始,每次向后走m个,然后把走到的这个元素从链表中删除,具体这个删除操作怎么搞呢?记录一个我这个元素的上一个是谁,就当是pre吧,然后让pre的指针指向当前元素的下一个就行。
然后继续走走走直到维护的这个链表长度为1为止。

###C.多项式相乘
####题目描述
首先输入第一个多项式中系数不为0的项的系数和指数,以一个空格分隔。且该多项式中各项的系数均为0或正整数,系数和最高幂次不会超过int类型的表示范围。对于多项式 anxn +a n-1 x n-1 + … + a1x1 + a0x0 的输入方法如下:
an n a n-1 n-1 … a1 1 a0 0
即相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。最后一项的指数后没有空格,只有一个回车换行符。
按照上述方式再输入第二个多项式。

####题目解决
这道题!我居然!调了!一个!小时!
【耻辱
简单的说,维护一个有序链表,链表中每个元素有另两个关键词,一个是系数一个是指数,按照指数有序。
两个多项式相乘,每次产生一个新的项,然后我们从前到后遍历这个链表,看看能不能合并同类项(找到一个指数相同的元素直接把当前的系数加在原来的系数上),如果找不到我们就把这个元素插入到链表中,要怎么才能够保证链表依然有序呢?我们把这个元素插在第一个比当前元素指数小的的元素前面就可以啦!
这个题的读入有一点点复杂,其实一个一个字符读读到空格转化数字,读到换行符停止就可以啦。

###D.文件加密(环)
####题目描述
太长了不复述

####题目解决
如果你会了链表操作那么这道题目就是一道模拟题【手动狗头
看看这道题需要几个步骤:首先去重的操作在之前的两个题解中都讲过啦,甚至加密的简单写法也讲啦,连环和删除在上面的B题里也说啦,好啦,现在把他们组合一下,这道题目你就做完了!
(好麻烦的一道题,语文题石锤)

###E.词频统计
####问题描述
编写程序统计一个英文文本文件中每个单词的出现次数(词频统计),并将统计结果按单词字典序输出到屏幕上。

注:在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。

####题目解决
其实要不是题目上括号一个数组或链表实现我还真没想起来trie或者map233
依然是维护一个有序链表,每个元素里面存两个东西,一个是词,另一个是出现过的次数,链表按照词的字典序排列。
怎么比较字符串,说过,怎么维护有序链表,说过啦。
然后最后遍历一遍这个链表输出就好啦!

1. 经过以下栈运算后,x的值是( )。 InitStack(s); Push(s,'a'); Push(s,'b'); Pop(s,x); Gettop(s,x); A. a B. b C. 1 D. 0 2.循环队列存储在数组A[0..m]中,则入队时的操作为( )。 A.rear=rear+1 B. rear=(rear+1) mod(m-1) C. rear=(rear+1)mod m D. rear=(rear+1) mod(m+1) 3. 栈队列的共同点是( )。 A.都是先进先出 B.都是先进后出 C.只允许在端点处插入删除元素 D.没有共同点 4. 若用一个大小为6的数组来实现循环队列,当 rear front 的值分别为 0 3。当从队列中删除一个元素,再插入两个元素后,rear front 的值分别为:( )。 A.1 5 B.2 4 C.4 2 D.5 1 5. 程序填顺序循环队列的类型定义如下: typedef int ET; typedef struct{ ET *base; int Front; int Rear; int Size; }Queue; Queue Q; 队列 Q 是否“满”的条件判断为( C )。 A.(Q.Front+1)=Q.Rear B.Q.Front=(Q.Rear+1) C.Q.Front=(Q.Rear+1)% Q.size D.(Q.Front+1) % Q.Size=(Q.Rear+1)% Q.size 6. 若进栈序列为1,2,3,4,进栈过程中可以出栈,则( )不可能是一个出栈序列。 A.3,4,2,1 B.2,4,3,1 C.1,4,2,3 D.3,2,1,4 7. 向顺序存储的循环队列 Q 中插入新元素的过程分为三步: ( )。 A.进行队列是否空的判断,存入新元素,移动队尾指针 B.进行队列是否满的判断,移动队尾指针,存入新元素 C.进行队列是否空的判断,移动队尾指针,存入新元素 D.进行队列是否满的判断,存入新元素,移动队尾指针 8. 关于栈队列,( )说法不妥。 A. 栈是后进先出表 B. 队列是先进先出表 C. 递归函数在执行时用到栈 D. 队列非常适用于表达式求值的算符优先法 9. 若用数组S[0..m]作为两个栈S1S2的共同存储结构,对任何一个栈,只有当S全满时才不能作入栈操作。为这两个栈分配空间的最佳方案是( )。 A.S1的栈底位置为0,S2的栈底位置为m B.S1的栈底位置为0,S2的栈底位置为m/2 C.S1的栈底位置为1,S2的栈底位置为m D.S1的栈底位置为1,S2的栈底位置为m/2 二、程序填空题(没特别标注分数的空的为3分,共 23 分)。 1.下面的算法是将一个整数e压入堆栈S,请在空格处填上适当的语句实现该操作。 typedef struct{ int *base; int *top; int stacksize; }SqStack; int Push(SqStack S,int e) { if ( S.top- S.base>= S.stacksize ) { S.base=(int *) realloc(S.base,(S.stacksize+1)*sizeof(int)); if( !S.base ) { printf(“Not Enough Memory!\n”); return(0); } S.top= S.base+ S.stacksize ; S.stacksize= S.stacksize+1 ; } * S.top++=e ; return 1; } 2. 在表达式:6+5+3*7/(4+9/3-2)求值过程中,处理到2时刻,运算符栈的状态为: + / ( - (4分),操作数栈的内容为11,21,7,2(4分)。 3. 递调用时,处理参数及返回地址,要用一种称为 栈 的数据结构。 4. 设循环队列中数组的下标范围是1-n,其头尾指针分别为fr,则其元素个数为_(r-f+n) mod n。
### 关于北京航空航天大学数据结构第三次作业 目前提供的引用中并未直接提及关于北京航空航天大学数据结构课程的第三次作业的具体题目或答案。然而,可以推测该课程的内容可能涉及基础的数据结构概念以及相关的编程实践。 #### 可能覆盖的主题 基于常见的数据结构课程安排,第三次作业通常会围绕以下主题展开: 1. **二叉搜索树(Binary Search Tree, BST)的操作** 构建、遍历、查找节点等操作可能是重点之一[^2]。 2. **链表相关操作** 如单链表反转、删除特定节点等问题可能会作为练习的一部分。 3. **栈与队列的应用** 这些基本数据结构的实际应用问题也常出现在早期作业中。 以下是针对上述假设的一个简单示例代码片段展示如何构建遍历一棵二叉搜索树: ```python class TreeNode: def __init__(self, key): self.left = None self.right = None self.val = key def insert(root, node): if root is None: return node if node.val < root.val: root.left = insert(root.left, node) else: root.right = insert(root.right, node) return root def inorder_traversal(root): if root: inorder_traversal(root.left) print(root.val, end=" ") inorder_traversal(root.right) # 测试代码 if __name__ == "__main__": r = TreeNode(50) insert(r, TreeNode(30)) insert(r, TreeNode(20)) insert(r, TreeNode(40)) insert(r, TreeNode(70)) insert(r, TreeNode(60)) insert(r, TreeNode(80)) print("Inorder traversal of the constructed tree:") inorder_traversal(r) ``` 此代码展示了如何创建一颗简单的二叉搜索树并对其进行中序遍历。 #### 样例路径解析 如果涉及到文件路径样例分析,则可能考察字符串处理能力或者更复杂的模式匹配算法。例如,在给定的一组路径中找出某些特定条件下的子集[^4]。 ```python import os paths = [ "D:\\MyDoc\\temp\\course\\math\\test.c", "D:\\MyDoc\\temp\\course\\lang\\test.c", "D:\\test.c", "D:\\MyDoc\\work\\test.c", "D:\\MyDoc\\work\\2018\\test.c", "D:\\MyDoc\\work\\2019\\test.c", "D:\\MyDoc\\temp\\course\\math\\three\\test.c", "D:\\MyDoc\\temp\\course\\math\\one\\prog\\test.c" ] filtered_paths = [path for path in paths if "2019" in path or "math" in path.lower()] print(filtered_paths) ``` 这段脚本筛选出了包含`2019`年份关键字或者是属于数学(`math`)目录下的所有`.c`源码文件路径。 ### 结论 由于具体第三次作业内容未明确定义在此文档集中,以上仅提供了一般性的指导方向及其潜在关联知识点实例演示。建议查阅官方发布的教学材料获取最权威版本的任务描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值