数据结构报告.docx
- 文档编号:27377373
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:21
- 大小:165KB
数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构报告
数据结构实验报告
学生:
王鑫
学院:
信息管理学院
学号:
2013302330026
老师:
陆泉
第二章实验报告
1、实验问题
2.4.2设计一个测试类,使其实际运行来测试单链表中各成员函数的正确性(p68).
2、解决思路
进行实验之前应该对单链表的定义以及各个操作的实现充分理解,而且需要明白各成员函数所代表的意义,利用测试函数对程序进行测试。
3、关键代码
packagech02;
publicclassExercise2_4_2{
publicstaticvoidmain(String[]args)throwsException{
//--------调用create(intn)从表尾到表头逆向建立单链表--------
System.out.println("请输入单链表中的5个数据元素:
");
LinkListL=newLinkList(5,true);//从表头到表尾顺序建立一个表长为5的单链表
System.out.println("单链表中各个数据元素:
");
L.display();//输出单链表中所有的数据元素
//--------调用length()求顺序表的长度--------
System.out.println("单链表的长度:
"+L.length());//输出顺序表的长度
//--------调用get(inti)取出第i个元素--------
if(L.get(3)!
=null)//取第三个元素
System.out.println("单链表中第3个元素:
"+L.get(3));
//--------调用indexOf(Objectx)查找x元素所在的位置--------
intorder=L.indexOf("d");//求出数据元素字符串c在顺序表中的位置
if(order!
=-1)
System.out.println("单链表中值为字符串d的数据元素的位置为:
"+order);
else
System.out.println("字符'd'不在此单链表中");
//--------调用remove(inti)删除数据元素--------
L.remove
(2);//删除第二个数据元素
System.out.println("删除第二个数据元素后单链表中各个数据元素:
");
L.display();
//--------调用insert(inti,Objectx)插入数据元素--------
L.insert(2,'d');//在单链表的第三个位置插入数据元素d
System.out.println("在2的位置插入数据元素d后单链表中数据元素顺序:
");
L.display();//输出单链表中所有的数据元素
//--------调用L.clear()将顺序表置空--------
L.clear();
System.out.println("单链表置空后的元素:
");
//--------调用isEmpty()判断顺序表是否为空--------
if(L.isEmpty())
System.out.println("单链表为空");
else{
System.out.println("单链表不为空,单链表中各个数据元素:
");
L.display();
}
}
}
4、典型实验数据与处理结果截屏
5、心得体会
单链表是一种动态的存储结构,进行插入、删除操作会比顺序表简单很多;头插法和尾插法两个相比,感觉尾插法更符合生活实际一点,更容易记忆;两种查找方式:
按位序号查找和按值查找因为都知识从表头开始沿着链依次比较,所以时间复杂度都是O(n),效率都算很高
第三章实验报告
一、实验问题
3.3.2编写一个函数判断一个字符序列是否为回文序列,所谓回文序列就是正读与反读都相同的字符序列,例如:
abba和abdba均是回文序列。
要求只使用栈来实现。
(p109)
2、解决思路
由于需要使用栈,而输入的字符串长度不固定,开始不能确定存储单元,所以应该使用链栈;首先创建一个链栈,将字符串的字符从前到后依次入栈,入栈完毕后,将字符串仍然从前到后与出栈元素对比,若出现不相同就不是回文序列,反之就是回文序列;
三、关键代码
packagech03;
publicclassTest3_3_2{
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
Strings1="wxxwxw";
Strings2="wxxxxw";
booleanx1,x2;
x1=isPalindSeq(s1);
x2=isPalindSeq(s2);
System.out.println("字符串"+s1+"是回文序列吗?
"+x1);
System.out.println("字符串"+s2+"是回文序列吗?
"+x2);
}
publicstaticbooleanisPalindSeq(Stringstr){
LinkStackS=newLinkStack();
inti=0;
for(;i S.push(str.charAt(i)); for(i=0;i charc=((Character)S.pop()).charValue(); if(c! =str.charAt(i)) returnfalse; } returntrue; } } 四、典型实验数据与处理结果截屏 五、心得体会 在每次编写程序前,都应该先想清楚这个程序应该是用栈还是队列,是用顺序存储还是链式存储,链栈存储结构不管是栈还是队列,在编写程序方面都会比顺序存储更容易出错,但是链式的因为各种操作都会比较方便,所以使用的比较多; 第四章实验报告 1、实验问题 编写基于SeqString类的成员函数count(),对一段文本进行分析并进行词频统计。 2、解决思路 1.由于进行文本分析首先要对文本出现的单词进行分词,统计单词出现的个数; 2.分词以后对于重复的单词进行查重; 3.对各个单词进行统计; (由于老师已经给出统计单词个数以及统计的程序,只需要进行查重即可,可以将老师所给的count函数修改为既可以统计去重前个数又可以统计去重后个数的函数) 3、关键代码 packagech04; publicclassDebug4_3_1extendsSeqString{ //主程序 publicstaticvoidmain(String[]args){ Stringwx="Howevermeanyourlifeis,meetitandliveit.donotshunitandcallithardnames."; System.out .println("测试的字符串为Howevermeanyourlifeis,meetitandliveit.donotshunitandcallithardnames."); Debug4_3_1seqwx=newDebug4_3_1(wx); String[]xin=seqwx.countxin(wx); inttemp; Stringx=null; int[]wx1=newint[xin.length];//创建数组wx1存放去重之后单词的频率 int[]wx2=newint[xin.length];//创建数组wx2存放进行词频之后单词的频率 //将分词去重后得到的词频存放到wx1中 for(inti=0;i wx1[i]=seqwx.stringcount(newSeqString(xin[i])); } //利用冒泡排序法将单词按照频率从大到小进行排序 for(inti=0;i for(intj=i+1;j if(wx1[i] temp=wx1[i]; wx1[i]=wx1[j]; wx1[j]=temp; x=xin[i]; xin[i]=xin[j]; xin[j]=x; } } } //打印词频统计 for(inti=0;i System.out.println("单词"+xin[i]+"的频率"+wx1[i]); } } SeqStringcurstr; publicDebug4_3_1(Stringstr){ super(str); this.curstr=newSeqString(str); } //对老师提供的count函数进行改造 publicString[]countxin(Stringstr){ charcurrChar; intrealnum=0;//记录实际单词变量 intnum=0;//记录去重后单词个数的标志变量 String[]wordcount=newString[str.length()]; for(inti=0;i wordcount[i]=""; for(inti=0;i currChar=str.charAt(i);//当前字符 if(((int)(currChar)>=65&&(int)(currChar)<=90)//当前字符不是字母 ||((int)(currChar)>=97&&(int)(currChar)<=122)) wordcount[num]+=currChar; else{ num++; realnum++; } //通过equals函数进行去重 if(num>1){ for(intj=0;j if(wordcount[num-1].equals(wordcount[j])){ wordcount[num-1]=""; num--; break; } } } System.out.println("去重前字符串共有单词数为"+realnum); System.out.println("去重后字符串共有单词数为"+num); String[]newword=newString[num]; for(inti=0;i 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;i table[i]=(int)(Math.random()*100); //产生一个0~100之间的随机数 } returntable; } retur
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告