数据结构实验报告2汇总.docx
《数据结构实验报告2汇总.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告2汇总.docx(38页珍藏版)》请在冰豆网上搜索。
数据结构实验报告2汇总
数据结构实验报告
实验1.汉诺塔的实现
一.需求分析
题目:
假设有三个命名为X,Y,Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,……,n的圆盘。
现按照要求将X轴上的n个圆盘移至塔座Z上,并仍按同样顺序叠排,圆盘移动时必须遵守以下规则:
1,每次只能移动一个;2,圆盘可以插在XYZ中的任一塔座上;3,任何时刻都不能将一个较大的圆盘压在较小的圆盘上。
需要输入的值:
圆盘的个数。
输出:
从X塔座上移至Z塔座上的顺序。
测试数据:
3,输出结果预测:
xy,xz,yz,xy,zy,zx,yx,yz,xy,xz,yz(箭头符号表示圆盘移动的次序)移动结束。
二.概要设计:
本实验主要运用递归的思想,先把上面的n-1个拿到Y盘,把最下面的一个Z盘,然后剩下的n-1个也用这样的思路,用递归调用的算法实现圆盘的移动。
三.详细设计:
四.调试分析:
遇到的问题:
移动时,步骤编号不变。
解决方法:
用static使其成为静态变量。
时间复杂度:
o(n);
经验体会:
递归可以把问题简单化,是个很好的方法。
五.使用说明:
输入盘子的数目即可。
六.测试结果:
七.源代码:
#include
#include
voidmove(chara,inti,charb){
staticintc=0;
printf("%i.movedisk%i.from%cto%c\n",++c,i,a,b);
}//移动
voidhanoi(intn,charx,chary,charz){
if(n==1)move(x,1,z);
else{
hanoi(n-1,x,z,y);
move(x,n,z);
hanoi(n-1,y,x,z);
}
}//递归
intmain(){
charx,y,z;
intn;
scanf("%d",&n);
x='x';
y='y';
z='z';
hanoi(n,x,y,z);//调用
return0;
}
实验2.字符串匹配。
一.需求分析:
输入一母串,另输入一字符串,判断该字符串是不是母串的字串,若是字串,则返回母串中字串的起始位置,否则输出不是字串。
输入:
两串字符;
输出:
返回值或0。
测试数据:
abcdefgijkefg预测结果:
4
二.概要设计:
用查找的方法,如果遇到第一个相同的字母,则字串母串同时往后移一个。
三.详细设计:
intsubstring(strings1,strings2)//s1是字串
{
inta=0,b,j=1,i;
for(b=0;bi=b;
for(;a{
if(s1[a]!
=s2[i]){j=0;continue;}//若s1的字母和s2的字母有一个不同则进行下一个的比较
elsei++;
j++;
if(j==s2.length())returna-s2.length()+1;//如果匹配,则返回母串中与字串开始匹配的位置
}
}
return0;
}
四.调试分析:
遇到的问题:
跳出循环时没有考虑到如果字串与母串相匹配则字串的字母也要向后移动一个。
解决方法:
字串同时后移一个如果前一个相匹配。
时间复杂度:
o(n^2);
经验体会:
设计算法时,即使是很简单的算法,也不能掉以轻心。
五.用户使用说明:
输入一字符串,换行,再输入一字符串,再换行,在换行,即可。
六.运算结果:
七.源代码:
#include
#include
usingnamespacestd;
intsubstring(strings1,strings2)//s1是字串
{
inta=0,b,j=1,i;
for(b=0;bi=b;
for(;a{
if(s1[a]!
=s2[i]){j=0;continue;}//若s1的字母和s2的字母有一个不同则进行下一个的比较
elsei++;
j++;
if(j==s2.length())returna-s2.length()+1;//如果匹配,则返回母串中与字串开始匹配的位置
}
}
return0;
}
intmain(){
strings1,s2;
getline(cin,s1);//输入母串
getline(cin,s2);//输入字串
cout<return0;
}
实验3.停车场管理。
一.需求分析:
问题:
用栈模拟停车场,汽车到达时记录下汽车的编号以及进停车场时间,离开时,记录下离开时间并结算停车费。
需要输入的数据:
汽车离开还是到达的信息,汽车的标号,以及汽车的到达或者离的时间。
需要输出的数据:
到达:
汽车停在哪里,离开:
汽车需要交多少钱。
测试数据:
n=2(即有多少停车位)。
(’A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
二.设计概要:
1.需要设计两个栈,一个作为停车场,一个作为把车退出来时,暂时停车的地方。
还需设计个队列,用来停放等进停车场的车。
2.当停车场中有空位时,才可以让其他的车进去,此时,来的车需要在便道上等待。
另外,要车子进停车场时,才计算时间。
在栈底的汽车退出来时,栈顶的车需要退出来,让栈底汽车退出来,在进入停车场,再从便道上取一辆等待停车的汽车。
三.详细设计:
1.汽车需要做成一个结构体或类:
classcar
{
charstatueinfo;//停车状态。
intcarnum;//汽车编号
inttime;//汽车离开或到达的时间
public:
car()
{
statueinfo='E';
carnum=0;
time=0;
}
car(charstatueinfo,intcarnum,inttime)
{
this->statueinfo=statueinfo;
this->carnum=carnum;
this->time=time;
}
chargets()//取车的状态
{
returnstatueinfo;
}
intgetcarnum()//车的编号
{
returncarnum;
}
intgettime()//车离开或到达的时间
{
returntime;
}
voidsettime(inttime)//重新设置时间
{
this->time=time;
}
voidsetcarnum(intcanum)//重新设置车的编号
{
this->carnum=carnum;
}
voidsetcarnum(charstatueinfo)//重新设计车的状态
{
this->statueinfo=statueinfo;
}
};
2.设计一个栈,用于停车或者暂时存放车辆。
classstack:
publiccar//栈
{
car*base;
car*top;
intstacksize;
public:
stack(){//初始化
stacksize=200;
base=newcar[stacksize];
top=base;
}
stack(intstacksize)//设计一个新的容量的栈
{
this->stacksize=stacksize;
base=newcar[stacksize];
top=base;
}
~stack(){}//解放栈的空间
car*gettop()//取栈顶
{
returntop-1;
}
car*getbase()//取栈底
{
returnbase-1;
}
intgetsize()//取栈的大小
{
returnstacksize;
}
car*push(care)//压入栈
{
//if(top-base>stacksize)return0;
*top=e;
top++;
returntop;
}
car*pop()//弹出栈
{
//if(top==base)return0;
top--;
returntop;
}
};
3.设计一个队列,用于存放没有停车位置的车。
classqueue:
publiccar//队列
{
car*front;
car*rear;
public:
queue()//初始化
{
front=newcar[200];
rear=front;
}
~queue(){}//解放队列
car*enqueue(care)//让车进入队列
{
*front=e;
front++;
returnfront;
}
car*dequeue()//让车出队列
{
rear++;
returnrear;
}
car*getfront()//取队头元素
{
returnfront;
}
car*getrear()//取队尾元素
{
returnrear;
}
};
四.调试分析:
1.怎样把车的所有信息绑在一起?
解决方法:
用一个类。
2.怎样把车所有的信息压入栈?
解决方法:
让栈直接在car的类上进行操作。
3.栈的压入出现问题,让top指针指向压入的元素,导致后来总出现联机错误,不能输入数据。
解决方法:
修改top指针的指向。
4.一开始没有设队列,把所有的车停在栈里,后来仔细看题目,才觉得有点不对。
解决方法:
设队列
时间复杂度:
o(n)
经验体会:
做题要仔细分析,不要信服气躁。
把数据压入栈后,要把指针向上移一个。
五.用户使用说明:
首先输入有几个停车车位,之后根据提示输入即可。
六.实验结果:
七.源代码:
#include
usingnamespacestd;
#defineSTACK_INIT_SIZE100;
#defineSTACKINCREMMNT10;
classcar
{
charstatueinfo;//停车状态。
intcarnum;//汽车编号
inttime;//汽车离开或到达的时间
public:
car()
{
statueinfo='E';
carnum=0;
time=0;
}
car(charstatueinfo,intcarnum,inttime)
{
this->statueinfo=statueinfo;
this->carnum=carnum;
this->time=time;
}
chargets()//取车的状态
{
returnstatueinfo;
}
intgetcarnum()//车的编号
{
returncarnum;
}
intgettime()//车离开或到达的时间
{
returntime;
}
voidsettime(inttime)//重新设置时间
{
this->time=time;
}
voidsetcarnum(intcanum)//重新设置车的编号
{
this->carnum=carnum;
}
voidsetcarnum(charstatueinfo)//重新设计车的状态
{
this->statueinfo=statueinfo;
}
};
classstack:
publiccar//栈
{
car*base;
car*top;
intstacksize;
public:
stack(){//初始化
stacksize=200;
base=newcar[stacksize];
top=base;
}
stack(intstacksize)//设计一个新的容量的栈
{
this->stacksize=stacksize;
base=newcar[stacksize];
top=base;
}
~stack(){}//解放栈的空间
car*gettop()//取栈顶
{
returntop-1;
}
car*getbase()//取栈底
{
returnbase-1;
}
intgetsize()//取栈的大小
{
returnstacksize;
}
car*push(care)//压入栈
{
//if(top-base>stacksize)return0;
*top=e;
top++;
returntop;
}
car*pop()//弹出栈
{
//if(top==base)return0;
top--;
returntop;
}
};
classqueue:
publiccar//队列
{
car*front;
car*rear;
public:
queue()//初始化
{
front=newcar[200];
rear=front;
}
~queue(){}//解放队列
car*enqueue(care)//让车进入队列
{
*front=e;
front++;
returnfront;
}
car*dequeue()//让车出队列
{
rear++;
returnrear;
}
car*getfront()//取队头元素
{
returnfront;
}
car*getrear()//取队尾元素
{
returnrear;
}
};
intmain(){
intn,carnum,time;
intt[100];
charstatueinfo;
cout<<"pleaseinputthetotalparkingspace:
"<cin>>n;
stacks;
stacks1(n);
queueq;
cout<while
(1)
{
cout<<"WELCOME!
thechargeofparkingis10yuanpertimeunit.\npleaseinputyourinfomation:
\n1.arriveordepartureinformation:
A(arrive),D(depature),E(end);\n2.yourcarnumber;\n3.yourarriveordeparturetime:
\n"<cin>>statueinfo>>carnum>>time;
carcar1(statueinfo,carnum,time);
if(car1.gets()=='A')//如果车辆到来
{
if(s1.gettop()-s1.getbase(){
s1.push(car1);//把车子停进停车场
cout<t[car1.getcarnum()]=car1.gettime();//把进停车场的时间记录下来
cout<<"thiscarnowstopinparkinglotandtheNO."<<(s1.gettop()-s1.getbase())<<"position\n"<}
else//如果停车场没有位置
{
q.enqueue(car1);//把车停入便道中
cout<<"thiscarnowstopinmakeshiftroadandtheNO."<<(q.getfront()-q.getrear())<<"position\n"<}
}
else
{
if(car1.gets()=='D')//如果车子离开
{
while(s1.gettop()->getcarnum()!
=car1.getcarnum())
{
s.push(*(s1.gettop()));
s1.pop();
}//当它不是停在栈顶,则把其他的车退出来停入另一个栈中
s1.pop();//弹出要离开的车
while(s.gettop()!
=s.getbase())
{
s1.push(*(s.gettop()));
s.pop();
}//把退出的车停回去
if(q.getfront()!
=q.getrear())//如果还有车在等停车
{
t[q.getrear()->getcarnum()]=car1.gettime();//把他进入停车场的时间记录下来
cout<getcarnum()<<":
"<getcarnum()]<s1.push(*(q.getrear()));
q.dequeue();
}//把等待进入停车场的车停入停车场
cout<<"youshouldpay"<<(car1.gettime()-t[car1.getcarnum()])*10<<"yuan.ThankYouforYourCustom!
\n"<}
else
{
if(statueinfo=='E')break;
elsecout<<"thereissomethingwrong.pleaseinputagain!
\n"<}
}
}
delete&s1;
delete&s;
return0;
}
实验4.程序分析
一.需求分析
问题:
读入一个c程序,统计程序中代码,注释和空行的行数以及行数的个数以及平均行数,并利用统计信息分析评价该代码的风格。
输入:
一个c程序的文件名。
输出:
统计信息以及评价。
测试的程序:
#include
#include
#include
intstrc(chara[10],charb[15],intn)
{
inti;
for(i=0;i{
if(a[i]!
=b[i])returni;
}
//查找到第一个不同的字母则返回
}
//字符串比较
intmain()
{
chara[10];
//charb[15];
intn;
scanf("%s",a);
//输入一字符串
n=strc(a,"void",6);
printf("%d\n",n);
//输出结果
return0;
}
二.概要设计:
1.需要用到文件的输入输出相关的知识,当遇到‘\n’表示一行,与这种方法计算行数
2.当遇到‘\\’表一注释行,当一行中只有‘\n’表示空行,还需要设计一个计算函数的函数来计算程序中共有多少个函数
三.详细设计:
1.字符串比较的函数
intstrc(chara[100],charb[8],intn)
//字符串的比较。
{
inti;
for(i=0;i{
if(a[i]!
=b[i])returni;
//返回到第一个不相等的字母的位置。
}
}
2.函数平均长度的评价表。
charG_Cclass(ints)
//平均代码行的等级关系。
{
if(s<=15&&s>=10)return'A';
else
{
if((s<=9&&s>=8)||(s>=16&&s<=20))return'B';
else
{
if((s>=5&&s<=7)||(s>=21&&s<=24))return'C';
else
{
if(s==5||s==24)return'D';
elsereturn'E';
//如果以上条件都不满足,则返回E.
}
}
}
}
3.占总行数比率的评价关系:
charG_ZBclass(doubles)
//注释行以及空白行的等级关系。
{
if(s>=0.15&&s<=0.25)return'A';
else
{
if((s<=0.14&&s>=0.10)||(s>=0.26&&s<=0.30))return'B';
else
{
if((s>=0.05&&s<=0.09)||(s>=0.31&&s<=0.35))return'C';
else
{
if(s==0.05||s==0.35)return'D';
elsereturn'E';
//以上条件都不满足,返回E。
}
}
}
}
4.判断是不是关键字
intCS(chard[])
//判断语句的前一个单词是不是关键词。
{
inta=0,i;
if(strc(d,"void",5)==4||strc(d,"int",5)==3||strc(d,"char",5)==4||strc(d,"double",8)==6||strc(d,"float",6)==5||strc(d,"bool",5)==4)
{
a++;
for(i=0;i{
if(d[i]=='('){a++;break;}
}
}
if(a==2)return2;
elsereturn0;
//a为标志。
}
5.判断是不是函数:
intG_F(FILE*fp,charfile[])
//判断函数的个数。