第三次数据结构作业

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

####题目解决
我其实不太知道这道题目用现在的知识应该怎么解??
写了个最短(长)路算法,floyd那种的,怎么抽象这个模型呢,就是把每一个线段都抽象成图论模型中的一个点,如果两条线段首尾相连就给他们俩中间连一条边长为1的边,然后用floyd跑一个最长路,枚举开始和结束的两个线段,然后找到最长路最长的一组,最长路长度+1输出就是本题的答案了
另:为什么会想到floyd呢,因为floyd是一个 O ( n 3 ) 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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]作为两个栈S1和S2的共同存储结构,对任何一个栈,只有当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,其头尾指针分别为f和r,则其元素个数为_(r-f+n) mod n。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值