1、数据结构实验报告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(箭头符号表示圆盘移动的次序)移动结束。二 概要设计:本实验
2、主要运用递归的思想,先把上面的n-1个拿到Y盘,把最下面的一个Z盘,然后剩下的n-1个也用这样的思路,用递归调用的算法实现圆盘的移动。三 详细设计: 四 调试分析:遇到的问题:移动时,步骤编号不变。解决方法:用static使其成为静态变量。时间复杂度:o(n);经验体会:递归可以把问题简单化,是个很好的方法。五使用说明:输入盘子的数目即可。六测试结果: 七源代码: #include#includevoid move(char a,int i,char b) static int c=0; printf(%i.move disk %i. from %c to %cn,+c,i,a,b);/移动v
3、oid hanoi(int n,char x,char y,char z) if(n=1) move(x,1,z); else hanoi(n-1,x,z,y); move(x,n,z); hanoi(n-1,y,x,z); /递归int main() char x,y,z; int n; scanf(%d,&n); x=x; y=y; z=z; hanoi(n,x,y,z);/调用 return 0; 实验2.字符串匹配。一 需求分析:输入一母串,另输入一字符串,判断该字符串是不是母串的字串,若是字串,则返回母串中字串的起始位置,否则输出不是字串。输入:两串字符;输出:返回值或0。测试数据:
4、abcdefgijk efg 预测结果:4二 概要设计:用查找的方法,如果遇到第一个相同的字母,则字串母串同时往后移一个。三 详细设计: int substring(string s1,string s2)/s1是字串 int a=0,b,j=1,i; for(b=0;bs2.length();b+) i=b; for(;as1.length();a+) if(s1a!=s2i) j=0;continue;/若s1的字母和s2的字母有一个不同则进行下一个的比较 else i+; j+; if(j=s2.length() return a-s2.length()+1;/如果匹配,则返回母串中与字
5、串开始匹配的位置 return 0;四 调试分析:遇到的问题:跳出循环时没有考虑到如果字串与母串相匹配则字串的字母也要向后移动一个。解决方法:字串同时后移一个如果前一个相匹配。时间复杂度:o(n2);经验体会:设计算法时,即使是很简单的算法,也不能掉以轻心。五 用户使用说明:输入一字符串,换行,再输入一字符串,再换行,在换行,即可。六 运算结果: 七 源代码: #include#includeusing namespace std;int substring(string s1,string s2)/s1是字串 int a=0,b,j=1,i; for(b=0;bs2.length();b+)
6、 i=b; for(;as1.length();a+) if(s1a!=s2i) j=0;continue;/若s1的字母和s2的字母有一个不同则进行下一个的比较 else i+; j+; if(j=s2.length() return a-s2.length()+1;/如果匹配,则返回母串中与字串开始匹配的位置 return 0;int main() string s1,s2; getline(cin,s1);/输入母串 getline(cin,s2);/输入字串 coutsubstring(s1,s2)statueinfo=statueinfo; this-carnum=carnum; t
7、his-time=time; char gets()/取车的状态 return statueinfo; int getcarnum()/车的编号 return carnum; int gettime()/车离开或到达的时间 return time; void settime(int time)/重新设置时间 this-time=time; void setcarnum(int canum)/重新设置车的编号 this-carnum=carnum; void setcarnum(char statueinfo)/重新设计车的状态 this-statueinfo=statueinfo; ;2.设计
8、一个栈,用于停车或者暂时存放车辆。class stack:public car/栈 car *base; car *top; int stacksize;public: stack()/初始化 stacksize=200; base=new carstacksize; top=base; stack(int stacksize)/设计一个新的容量的栈 this-stacksize=stacksize; base=new carstacksize; top=base; stack()/解放栈的空间 car *gettop()/取栈顶 return top-1; car *getbase()/取栈
9、底 return base-1; int getsize()/取栈的大小 return stacksize; car *push(car e)/压入栈 /if(top-basestacksize) return 0; *top=e; top+; return top; car *pop()/弹出栈 /if(top=base) return 0; top-; return top; ;3.设计一个队列,用于存放没有停车位置的车。class queue:public car/队列 car *front; car *rear;public: queue()/初始化 front=new car200;
10、 rear=front; queue()/解放队列 car *enqueue(car e)/让车进入队列 *front=e; front+; return front; car *dequeue()/让车出队列 rear+; return rear; car *getfront()/取队头元素 return front; car *getrear()/取队尾元素 return rear; ;四 调试分析:1. 怎样把车的所有信息绑在一起?解决方法:用一个类。2. 怎样把车所有的信息压入栈?解决方法:让栈直接在car的类上进行操作。3. 栈的压入出现问题,让top指针指向压入的元素,导致后来总出
11、现联机错误,不能输入数据。解决方法:修改top指针的指向。4. 一开始没有设队列,把所有的车停在栈里,后来仔细看题目,才觉得有点不对。解决方法:设队列时间复杂度:o(n)经验体会:做题要仔细分析,不要信服气躁。把数据压入栈后,要把指针向上移一个。五 用户使用说明:首先输入有几个停车车位,之后根据提示输入即可。六 实验结果: 七 源代码: #includeusing namespace std;#define STACK_INIT_SIZE 100;#define STACKINCREMMNT 10;class car char statueinfo;/停车状态。 int carnum;/汽车编
12、号 int time;/汽车离开或到达的时间public: car() statueinfo=E; carnum=0; time=0; car(char statueinfo,int carnum,int time) this-statueinfo=statueinfo; this-carnum=carnum; this-time=time; char gets()/取车的状态 return statueinfo; int getcarnum()/车的编号 return carnum; int gettime()/车离开或到达的时间 return time; void settime(int
13、time)/重新设置时间 this-time=time; void setcarnum(int canum)/重新设置车的编号 this-carnum=carnum; void setcarnum(char statueinfo)/重新设计车的状态 this-statueinfo=statueinfo; ;class stack:public car/栈 car *base; car *top; int stacksize;public: stack()/初始化 stacksize=200; base=new carstacksize; top=base; stack(int stacksiz
14、e)/设计一个新的容量的栈 this-stacksize=stacksize; base=new carstacksize; top=base; stack()/解放栈的空间 car *gettop()/取栈顶 return top-1; car *getbase()/取栈底 return base-1; int getsize()/取栈的大小 return stacksize; car *push(car e)/压入栈 /if(top-basestacksize) return 0; *top=e; top+; return top; car *pop()/弹出栈 /if(top=base)
15、 return 0; top-; return top; ;class queue:public car/队列 car *front; car *rear;public: queue()/初始化 front=new car200; rear=front; queue()/解放队列 car *enqueue(car e)/让车进入队列 *front=e; front+; return front; car *dequeue()/让车出队列 rear+; return rear; car *getfront()/取队头元素 return front; car *getrear()/取队尾元素 re
16、turn rear; ;int main() int n,carnum,time; int t100; char statueinfo; coutplease input the total parking space:n; stack s; stack s1(n); queue q; couts1.getsize()endl; while(1) coutWELCOME! the charge of parking is 10 yuan per time unit.nplease input your infomation:n1.arrive or departure information:
17、A(arrive),D(depature),E(end);n2.your car number;n3.your arrive or departure time:nstatueinfocarnumtime; car car1(statueinfo,carnum,time); if(car1.gets()=A)/如果车辆到来 if(s1.gettop()-s1.getbase()s1.getsize()/如果停车场还有位置 s1.push(car1);/把车子停进停车场 couts1.getsize()endl; tcar1.getcarnum()=car1.gettime();/把进停车场的时
18、间记录下来 coutthis car now stop in parking lot and the NO.(s1.gettop()-s1.getbase() positionnendl; else/如果停车场没有位置 q.enqueue(car1);/把车停入便道中 coutthis car now stop in makeshift road and the NO.(q.getfront()-q.getrear() positionngetcarnum()!=car1.getcarnum() s.push(*(s1.gettop(); s1.pop(); /当它不是停在栈顶,则把其他的车退
19、出来停入另一个栈中 s1.pop();/弹出要离开的车 while(s.gettop()!=s.getbase() s1.push(*(s.gettop(); s.pop(); /把退出的车停回去 if(q.getfront()!=q.getrear()/如果还有车在等停车 tq.getrear()-getcarnum()=car1.gettime();/把他进入停车场的时间记录下来 coutgetcarnum() : getcarnum()endl; s1.push(*(q.getrear(); q.dequeue(); /把等待进入停车场的车停入停车场 coutyou should pay
20、 (car1.gettime()-tcar1.getcarnum()*10 yuan. Thank You for Your Custom !nendl; else if(statueinfo=E) break; else coutthere is something wrong.please input again!nendl;/结束 delete &s1; delete &s; return 0;实验4.程序分析一 需求分析问题:读入一个c程序,统计程序中代码,注释和空行的行数以及行数的个数以及平均行数,并利用统计信息分析评价该代码的风格。输入:一个c程序的文件名。输出:统计信息以及评价。
21、测试的程序:#include#include#includeint strc(char a10,char b15,int n) int i; for(i=0;in;i+) if(ai!=bi) return i; /查找到第一个不同的字母则返回/字符串比较int main() char a10; /char b15; int n; scanf(%s,a); /输入一字符串 n=strc(a,void ,6); printf(%dn,n); /输出结果 return 0;二 概要设计:1. 需要用到文件的输入输出相关的知识,当遇到n表示一行,与这种方法计算行数2. 当遇到表一注释行,当一行中只有
22、n表示空行,还需要设计一个计算函数的函数来计算程序中共有多少个函数三 详细设计:1.字符串比较的函数int strc(char a100,char b8,int n)/字符串的比较。 int i; for(i=0;in;i+) if(ai!=bi) return i; /返回到第一个不相等的字母的位置。 2.函数平均长度的评价表。 char G_Cclass(int s)/平均代码行的等级关系。 if(s=10) return A; else if(s=8)|(s=16&s=5&s=21&s=0.15&s=0.25) return A; else if(s=0.10)|(s=0.26&s=0.
23、05&s=0.31&s=0.35) return C; else if(s=0.05|s=0.35) return D; else return E; /以上条件都不满足,返回E。 4. 判断是不是关键字 int CS(char d)/判断语句的前一个单词是不是关键词。 int a=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;istrlen(d)-2;i+) if(di=() a+;break; if(a=2) return 2; else return 0;/a为标志。5. 判断是不是函数: int G_F(FILE *fp,char file)/判断函数的个数。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1