newword[i]=wordcount[i];
returnnewword;
}
//老师提供的统计某个单词词频的函数
publicintstringcount(SeqStringstr){
SeqStringsource=this.curstr;
intcount=0,begin=0;
intindex;
while((index=source.indexOf(str,begin))!
=-1){
count++;
begin=index+str.length();
}
returncount;
}
}
4、典型实验数据与处理结果截屏
5、心得体会
因为已经给了怎样统计未去重的单词个数以及某个单词的词频统计,对一段文本如何进行去重是重点;由于统计个数的时候分词没有分很多情况,所以遇到一些带有其他符号的文本统计不是很准确,健壮性不是很高;
第五章实验报告
一、实验问题
编写算法求一棵二叉树的根结点root到一个指定结点p之间的路径并输出。
2、解决思路
由于所求为从根节点到某一节点的路径,如果采用前跟遍历时间复杂度会很大,可以采用后跟遍历的思想,找到指定节点的位置,然后一直找其双亲结点,最终求得的路径保存在一个链栈中,其中根结点处于栈顶位置,指定结点处于栈底位置。
3、关键代码
//主程序测试
publicclassTest5_3_3{
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
//建立一个根节点为a的二叉树
BiTreeNoded=newBiTreeNode('D');
BiTreeNodeg=newBiTreeNode('G');
BiTreeNodeh=newBiTreeNode('H');
BiTreeNodee=newBiTreeNode('E',g,null);
BiTreeNodeb=newBiTreeNode('B',d,e);
BiTreeNodef=newBiTreeNode('F',null,h);
BiTreeNodec=newBiTreeNode('C',f,null);
BiTreeNodea=newBiTreeNode('A',b,c);
BiTreex=newBiTree(a);
System.out.print("层次遍历序列为:
");
x.levelTraverse();
System.out.println();
//用sf的链栈表示a到f的路径
LinkStacksf=x.getPath(a,f);
if(!
sf.isEmpty())
System.out.print(((BiTreeNode)sf.pop()).getData());
while(!
sf.isEmpty()){
System.out.print("——>");
System.out.print(((BiTreeNode)sf.pop()).getData());
}
System.out.println("");
//用sh的链栈表示a到h的路径
LinkStacksh=x.getPath(a,h);
if(!
sh.isEmpty())
System.out.print(((BiTreeNode)sh.pop()).getData());
while(!
sh.isEmpty()){
System.out.print("——>");
System.out.print(((BiTreeNode)sh.pop()).getData());
}}
}
//方法:
用链栈存储路径
publicLinkStackgetPath(BiTreeNoderoot,BiTreeNodep){
BiTreeNodeT=root;
LinkStackS=newLinkStack();//构造链栈
if(T!
=null){
S.push(T);//根结点进栈
Booleanflag;//访问标记
BiTreeNodeq=null;//q指向刚被访问的结点
while(!
S.isEmpty()){
while(S.peek()!
=null)
//将栈顶结点的所有左孩子结点入栈
S.push(((BiTreeNode)S.peek()).getLchild());
S.pop();//空结点退栈
while(!
S.isEmpty()){
T=(BiTreeNode)S.peek();//查看栈顶元素
if(T.getRchild()==null||T.getRchild()==q){
if(T.equals(p)){
//对栈S进行倒置,以保证根结点处于栈顶位置
LinkStackS2=newLinkStack();
while(!
S.isEmpty())
S2.push(S.pop());
returnS2;
}
S.pop();//移除栈顶元素
q=T;//q指向刚被访问的结点
flag=true;//设置访问标记
}else{
S.push(T.getRchild());//右孩子结点入栈
flag=false;//设置未被访问标记
}
if(!
flag)
break;
}}}
returnnull;
}
4、典型实验数据与处理结果截屏
主程序分别测试了根节点a到f和h的路径;
5、心得体会
栈和队列是很经典的两个线性表,在那都能出现他们。
第6章实验报告
1、实验问题
在邻接矩阵存储结构上实现图的基本操作:
InsertArc(G,v,w),DeleteArc(G,v,w)。
2、解决思路
通过对邻接矩阵vex和arc的改变,对矩阵进行插入和删除。
3、关键代码
packagech06;
importch06.GraphKind;
importch06.MGraph;
publicclassExercise6_5_1{
publicfinalstaticintINFINITY=Integer.MAX_VALUE;
voidinsertArc(MGraphG,Objectv,Objectw,intP){
intiv=G.locateVex(v);
intiw=G.locateVex(w);
int[][]arcs=G.getArcs();
arcs[iv][iw]=P;
G.setArcs(arcs);
G.setArcNum(G.getArcNum()+1);
}
voiddeleteArc(MGraphG,Objectv,Objectw){
intiv=G.locateVex(v);
intiw=G.locateVex(w);
int[][]arcs=G.getArcs();
arcs[iv][iw]=INFINITY;
G.setArcs(arcs);
G.setArcNum(G.getArcNum()-1);
}
publicstaticvoidmain(String[]args)throwsException{
Objectvexs[]={"v0","v1","v2","v3","v4","v5"};
int[][]arcs={{0,7,1,5,INFINITY,INFINITY},
{7,0,6,INFINITY,3,INFINITY},{1,6,0,7,6,4},
{5,INFINITY,7,0,INFINITY,2},
{INFINITY,3,6,INFINITY,0,7},
{INFINITY,INFINITY,4,2,7,0}};
MGraphG=newMGraph(GraphKind.UDG,6,10,vexs,arcs);
System.out.println("修改前图的边数为:
"+G.getArcNum());
Exercise5_1exercise5_1=newExercise5_1();
exercise5_1.insertArc(G,"v0","v1",7);
System.out.println("增加V0-V1边后,图的边数为:
"+G.getArcNum());
exercise5_1.deleteArc(G,"v0","v1");
System.out.println("删除V0-V1边后,图的边数为:
"+G.getArcNum());
}
}
四、典型实验数据与处理结果截屏
5、心得体会
(体会)图这一章真的好难,很多东西似懂非懂。
第7章实验报告
1、实验问题
试设计算法,实现双向冒泡排序(即相邻两遍向相反方向冒泡)。
2、解决思路
类比冒泡排序法,一次排序将最大的数字“沉到最下面”,把最小的数字“浮到最上面”,然后一直重复进行排序,知道排序结束;
3、关键代码
packagech07;
publicclassTest7_3_3{
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
int[]s=random(10);
System.out.println("产生的随机数组为");
print(s);
int[]news=dbubblesort(s);
System.out.println("经过双冒泡排序之后的数组为");
print(news);
}
//产生随机数方法
publicstaticint[]random(intn){
if(n>0){
inttable[]=newint[n];
for(inti=0;itable[i]=(int)(Math.random()*100);
//产生一个0~100之间的随机数
}
returntable;
}
retur