数据结构报告.docx

上传人:b****3 文档编号:27377373 上传时间:2023-06-30 格式:DOCX 页数:21 大小:165KB
下载 相关 举报
数据结构报告.docx_第1页
第1页 / 共21页
数据结构报告.docx_第2页
第2页 / 共21页
数据结构报告.docx_第3页
第3页 / 共21页
数据结构报告.docx_第4页
第4页 / 共21页
数据结构报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

数据结构报告.docx

《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(21页珍藏版)》请在冰豆网上搜索。

数据结构报告.docx

数据结构报告

数据结构实验报告

 

学生:

王鑫

学院:

信息管理学院

学号:

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模板 > 艺术创意

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1