第一篇:数据结构与算法实验班学习体会
数据结构与算法实验班学习体会
000648043 姚金宇
我是计算机系202_级本科生,在大二上学期选修了张铭老师的数据结构与算法实验班。数据结构与算法课是每一个计算机专业学生的必修课,从我目前所学习的后续课程,包括算法设计、编译技术等课程来看,这门课是其非常重要的基础课程之一。
我从初中就开始接触高中的信息学奥林匹克竞赛,对数据结构与算法方面的相关知识接触的比较早。张老师为了更有针对性地对具有不同基础的学生进行因材施教,开设了数据结构算法实验班,我很荣幸地被批准通过选修实验班的课。通过一个学期的学习,我加深了对数据结构与算法的相关知识的理解,并通过张老师细致地讲解,将自己过去从高中竞赛所学到的离散的、碎片式的知识点连贯地串了起来,形成了一套较为完整的知识体系。我想这对于我后续的学习和对更高层次数据结构与算法知识的探索,都是大有裨益的。
我认为,在这门课的学习过程中,张老师所引导我们掌握的不仅仅是知识点与问题的简单联系,而是进行拓展性地思考和探索。例如树的顺序存储,除了讲解各种带标记的存储方法以外,我们还讨论了这些存储方式中记录的信息是不是都是必须的、如何用最少的标记信息表示一棵树等问题。这就让我们对原本看似平凡的知识有更深刻的认识。另外,我们所完成的作业和练习也都不是简单的解题训练,很多问题都是带有可研究性与可扩展性的,甚至很多问题没有单一的结论,这就引导我们创造性地应用所学的知识去研究问题、解决问题。
张老师在实验班的课堂上不但注重基础知识的讲解,还会适当介绍一些较为高级的数据结构(例如伸展树、后缀树等),以及一些较新的算法研究成果。这些介绍不仅对于巩固基础数据结构有很强的促进作用,还让对我们往后更难的课程更有信心。事实上,我认为算法与数据结构在我们计算机专业课程的学习中是无处不在的,图论中的树、图模型,组合数学中模型的计数,编译技术中关于文法的分析、自动机模型,无一不包含数据结构与算法的理论。能够更快、更好地掌握后续这些课程的知识体系,于我在数据结构与算法课中所学是分不开的。我是北大ACM队员之一,并于今年代表北京大学参加了第32届ACM-ICPC国际大学生程序设计竞赛全球总决赛,获得了第13名。ACM-ICPC竞赛十分注重选手对于模型抽象的能力、对于数据结构与算法的理解以及编程能力。这门课程对我参加ACM竞赛无疑也是帮助甚大。它让我更系统、透彻地理解了数据结构与算法的相关知识,对于在赛场上的解题能力和解题速度都有很大的提高。总而言之,张老师的数据结构与算法这门课程作为我的必修课之一,对于我计算机专业的学习是帮助很大并且影响深远的。
北京大学计算机系202_级本科生
000648043 姚金宇
202_年4月14日
第二篇:数据结构与算法课程设计 心得体会 学习体会
课程设计的心得体会
陈康荫080401200708级计科系计本(2)班
完成了这次的二元多项式加减运算问题的课程设计后,我的心得体会很多,细细梳理一下,有以下几点:
1、程序的编写中的语法错误及修改
因为我在解决二元多项式问题中,使用了链表的方式建立的二元多项式,所以程序的空间是动态的生成的,而且链表可以灵活地添加或删除结点,所以使得程序得到简化。但是出现的语法问题主要在于子函数和变量的定义,降序排序,关键字和函数名称的书写,以及一些库函数的规范使用,这些问题均可以根据编译器的警告提示,对应的将其解决。
2、程序的设计中的逻辑问题及其调整
我在设计程序的过程中遇到许多问题,首先在选择数据结构的时候选择了链表,但是链表的排序比较困难,特别是在多关键字的情况下,在一种关键字确定了顺序以后,在第一关键字相同的时候,按某种顺序对第二关键字进行排序。在此程序中共涉及到3个量数,即:系数,x的指数和y的指数,而关键字排是按x的指数和y的指数来看,由于要求是降幂排序且含有2个关键字,所以我先选择x的指数作为第一关键字,先按x的降序来排序,当x的指数相同时,再以y为关键字,按照y的指数大小来进行降序排列。
另外,我在加法函数的编写过程中也遇到了大量的问题,由于要同时比较多个关键字,而且设计中涉及了数组和链表的综合运用,导致反复修改了很长的时间才完成了一个加法的设计。但是,现在仍然有一个问题存在:若以0为系数的项是首项则显示含有此项,但是运算后则自动消除此项,这样是正确的。但是当其不是首项的时候,加法函数在显示的时候有0为系数的项时,0前边不显示符号,当然,这样也可以理解成当系数为0时,忽略这一项。这也是本程序中一个不完美的地方。
我在设计减法函数的时候由于考虑不够充分就直接编写程序,走了很多弯路,不得不停下来仔细研究算法,后来发现由于前边的加法函数完全适用于减法,只不过是将二元多项式B的所有项取负再用加法函数即可,可见算法的重要性不低于程序本身。
3、程序的调试中的经验及体会
我在调试过程中,发生了许多小细节上的问题,它们提醒了自己在以后编程的时候要注意细节,即使是一个括号的遗漏或者一个字符的误写都会造成大量的错误,浪费许多时间去寻找并修改,总结的教训就是写程序的时候,一定要仔细、认真、专注。
我还有一个很深的体会就是格式和注释,由于平时不注意格式和注释这方面的要求,导致有的时候在检查和调试的时候很不方便。有的时候甚至刚刚完成一部分的编辑,结果一不注意,就忘记了这一部分程序的功能。修改的时候也有不小心误删的情况出现。如果注意格式风格,并且养成随手加注释的习惯,就能减少这些不必要的反复和波折。还有一点,就是在修改的时候,要注意修改前后的不同点在哪里,改后调试结果要在原有的基础上更加精确。
第三篇:数据结构与算法课程设计 心得体会 学习体会
课程设计的心得体会
每一次课程设计,都有不一样的感受,通过课程设计,对我而言,得到的不仅仅是知识,更是获得知识的方法,这显得更加的重要。
本次课程设计,我的设计题目是校园导游程序,本程序主要用到的是课本中图的知识,以校园中的景点作为顶点,以景点间的路径作为边,就构成了图。我用到的时临界表存储结构,这样对空间的浪费不至于很大。主要完成的功能是最短路径和所有路径的算法,最短路径用的是书上的Dijkstra算法,原来我对这个算法的只是出于一个对大致的过程知道的程度,课程设计之后,我对该算法可以说是很熟悉了,不管是算法思想还是代码。另一个主要功能是求两个景点间的所有路径,这个算法书上没有提到,我一步步的摸索,用了一个递归的思想,再经过不断的修改,一次次的单步运行,通过查看相应变量的变化情况,将此算法实现的。最后完成整个程序。
课程设计,本人感觉对于写程序,首先要要的是思想,即完成每个功能需要的算法思想,在想好思想后,就要具体到代码,计算机能够识别的代码,代码写好后,大多情况下是有错误的,首先要排除语法错误,然后时语义错误,在排错的过程中,我用到的最多的是单步运行,感觉单步运行这种方式很管用,通过一步步的运行,通过每一步的运行,观察其中变量的变化情况,可以很容易的知道代码是哪一步出了错误,这样对排错有很大的帮助。在课程设计的过程中,曾遇到过很多的问题,如对路径字符串的处理,整个递归一步步的往下调用和返回过程,还有很多细节的问题。在遇到问题时,首先想到的是自己思考,分析过程,查找资料,上网百度,通过自己的努力还没有解决时,这是首先需要问的是自己旁边的同学,和同学讨论,有时还争得面红耳赤,如果最后将此不下,就向老师提问。这课程设计的过程中,我几乎所有的问题处理流程就是这个样子的。我感觉这就是一种学习的方法,在学习中遇到难题时的学习方法,要把这种学习的方法变成一种习惯,这才是每次课程设计应达到的一种效果。
课程设计提供了这样一种学习的机会,可以随时随地向老师请教,和老师交流的一个机会,和同学互相讨论的机会。课程设计教会了我,如何用计算机程序来处理现实中的实际问题。将现实中的实际问题先转化为数学模型,然后将数学模型用程序解决的一种能力。
第四篇:数据结构与算法课程设计 心得体会 学习体会
课程设计的心得体会
刚一开始抽到题目,我一看觉得无从下手,由于那个时候很多课都还在进行着,也就是抽空思考一下思路,也到图书馆中借了相关的书来参考,但没有进行很深入的研究。课程设计开始的时候,我开始思考我该如何去求解,确定了算法之后,就开始写程序,修改错误,调试,直至完成,在这一过程中,让我学会了很多东西。
在课程设计结束后,我对书本,也就是我们的教材的认识有了很大的提高。以前我觉得能看懂书上的知识,能写出算法就认为自己学的还可以。可是通过课程设计,通过我对书上知识的研究,我发现其实书上有很多东西是我没有领略到的。我的算法的核心思想就是图的深度优先搜索遍历,在用邻接表对图完成存储之后,我就开始仔细的看书上有关图的遍历的知识,包括深度优先搜索遍历和广度优先搜索遍历,就那么几页纸,我看了不知道多少遍。刚一开始看一下,觉得自己会了,然后做程序,遇到问题再拿书看,没看一次我对算法的理解就更进了一步。通过这次课程设计,让我明白了书上的知识看似是很有限的,但它蕴含的东西值得我们去花更多的时间去研究。学知识不能只学表面的知识,做出一个深度优先搜索遍历程序不等于你就掌握了深度优先搜索遍历算法,其他知识也是这样,其他科目的学习也同样是这样。学习要抓住知识的精髓。
在课程设计这两个星期中,让我明白了独立思考的重要性。一个东西只有经过自己的思考,自己明白了才是真的明白了,别人说的再明白不等于我明白。在思考的过程中,我发现对一个问题,你思考的月深入,可以挖掘的东西就越多。我做的题目是分酒问题:三个酒杯,一个能装8kg,一个能装5kg,一个能装3kg,8kg是空的,5kg和3kg是满的,不借助其他工具,最终分出两个4kg。看似无从下手,但经过思考之后我确立了用图来求解,但是怎样抽象成图,抽象成什么样的图,模型确立后,图有很多种存储结构,采用哪一种存储结构是最优的等等问题都要去思考。最终我确定采用邻接表作为存储结构,图的深度优先搜索遍历来求解。
独立思考很重要,跟别人交流也很重要。在我和别人交流的时候,开阔了我的思维空间,很多原先我没想到的东西一下子就蹦出来了,而且能填补我知识的空白。跟老师交流就更重要了,以老师的知识层面和对问题的见解,他的想法具有很强的针对性和可行性。做好程序后,在写实验报告的时候,我发现在写实验报告的过程中,我对我的算法有了更进一步的认识,因为我要写出来,写出来的实验报告不仅我自己能看明白,更关键的是别人能看明白。这样就要求我用简练的语言来描述我的算法,而且对我的语言组织能力也是一次考验。
总之,这次课程设计让我对数据结构有了更深的认识,不仅体现在知识上,还体现在对知识的认识、对学习的认识和对方法的认识。
第五篇:算法与数据结构(定稿)
金陵科技学院实验报告
学 生 实 验 报 告 册
课程名称:
学生学号:
所属院部:计算机工程学院
(理工类)
算法与数据结构 专业班级: 计算机统招(1)班
1413101006 学生姓名: 邢亦波
指导教师: 徐永华 15 ——20 16 学年 第 2 学期
金陵科技学院教务处制
金陵科技学院实验报告
实验报告书写要求
实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。
实验报告书写说明
实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。
填写注意事项
(1)细致观察,及时、准确、如实记录。(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明
实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。
实验报告装订要求
实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
金陵科技学院实验报告
实验项目名称: 顺序表 实验学时: 2 同组学生姓名: 无 实验地点: 实验日期: 04.05 实验成绩: 批改教师: 徐永华 批改时间:
金陵科技学院实验报告
实验1 顺序表
一、实验目的和要求
掌握顺序表的定位、插入、删除等操作。
二、实验仪器和设备
Turbo C 2.0
三、实验内容与过程(含程序清单及流程图)
1、必做题
(1)编写程序建立一个顺序表,并逐个输出顺序表中所有数据元素的值。编写主函数测试结果。
(2)编写顺序表定位操作子函数,在顺序表中查找是否存在数据元素x。如果存在,返回顺序表中和x值相等的第1个数据元素的序号(序号从0开始编号);如果不存在,返回-1。编写主函数测试结果。(3)在递增有序的顺序表中插入一个新结点x,保持顺序表的有序性。
解题思路:首先查找插入的位置,再移位,最后进行插入操作;从第一个元素开始找到第一个大于该新结点值x的元素位置i即为插入位置;然后将从表尾开始依次将元素后移一个位置直至元素i;最后将新结点x插入到i位置。
(4)删除顺序表中所有等于X的数据元素。
2、选做题
(5)已知两个顺序表A和B按元素值递增有序排列,要求写一算法实现将A和B归并成一个按元素值递减有序排列的顺序表(允许表中含有值相同的元素)。
金陵科技学院实验报告
程序清单: 1.(1)
#include
} void display(shun *s){
} main()int i;if(s->length==0)printf(“没有数据n”);else for(i=0;i
金陵科技学院实验报告
{
} init(&s);setup(&s);display(&s);
1.(2)
#include
} int find(shun *s,int x){ int i;for(i=0;i
金陵科技学院实验报告
if(s->a[i]==x)return i;} return 0;} void display(shun *s){
} main(){
} int x;init(&s);setup(&s);display(&s);printf(“输入Xn”);scanf(“%d”,&x);if(find(&s,x))printf(“找到位置是%dn”, find(&s,x));printf(“-1n”);else int i;if(s->length==0)printf(“没有数据n”);else for(i=0;i
1.(3)#include
金陵科技学院实验报告
} void setup(shun *s){
} void insert(shun *s,int x){ int i,j;if((s->length+1)>=maxsize){ printf(“溢出n”);exit(0);int i,j;printf(“需要几个数n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要几个数n”);scanf(“%d”,&s->length);} for(i=0;i
int i;if(s->length==0)printf(“没有数据n”);else for(i=0;i
金陵科技学院实验报告
} main(){
} int x;init(&s);setup(&s);printf(“输入Xn”);scanf(“%d”,&x);insert(&s,x);display(&s);{ } printf(“%-5d”,s->a[i]);
1.(4)#include
int i,j;printf(“需要几个数n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要几个数n”);scanf(“%d”,&s->length);s->length=0;printf(“溢出n”);
金陵科技学院实验报告
} void delet(shun *s,int x){ int i,j;for(i=0;i
} void display(shun *s){
} main(){
} int x;init(&s);setup(&s);printf(“输入Xn”);scanf(“%d”,&x);delet(&s,x);display(&s);int i;if(s->length==0)printf(“没有数据n”);else for(i=0;i
for(j=i;j
金陵科技学院实验报告
2.#include
} } int i,j,t;printf(“需要几个数n”);scanf(“%d”,&s->length);while(s->length>=maxsize){ printf(“需要几个数n”);scanf(“%d”,&s->length);} for(i=0;i
for(j=i+1;j
} if(s->a[i]
} t=s->a[i];s->a[j]=t;s->a[i]=s->a[j];scanf(“%d”,&s->a[i]);s->length=0;printf(“溢出n”);
金陵科技学院实验报告
void cat(shun *A,shun *B){ int i,j=0,t;if((A->length+B->length)>=maxsize){
} for(i=0;ilength;i++){ } for(j=0;j
} C.length=A->length+B->length;
} void display(shun *s){
} int i;if(s->length==0)printf(“没有数据n”);else for(i=0;i for(j=i+1;j } if(C.a[i] } t=C.a[i];C.a[j]=t;C.a[i]=C.a[j];C.a[i]=B->a[j];i++;C.a[i]=A->a[i];printf(“溢出n”);exit(0); 金陵科技学院实验报告 main(){ } init(&A);printf(“A初始化n”);setup(&A);init(&B);setup(&B);cat(&A,&B);display(&C);printf(“B初始化n”); 金陵科技学院实验报告 四、实验结果与分析(程序运行结果及其分析)1.(1) 1.(2) 金陵科技学院实验报告 1.(3) 1.(4) 金陵科技学院实验报告 2.金陵科技学院实验报告 五、实验体会(遇到问题及解决办法,编程后的心得体会) 我觉得编程不能只要完成其主要功能就行了,还要考虑到边界值,考虑是否会出错等等。有时候一种方法编不通,不如换种方法编。我觉得编程挺考虑耐心的,恩,就这么多感悟了。 金陵科技学院实验报告 实验项目名称: 单链表 实验学时: 2 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间: 金陵科技学院实验报告 实验2 单链表 一、实验目的和要求 1、实验目的 掌握单链表的定位、插入、删除等操作。 2、实验要求 (1)注意链表的空间是动态分配的,某结点不用之后要及时进行物理删除,以便释放其内存空间。 (2)链表不能实现直接定位,一定注意指针的保存,防止丢失。 二、实验仪器和设备 Turbo C 2.0 三、实验内容与过程(含程序清单及流程图) 1、必做题 (1)编写程序建立一个单链表,并逐个输出单链表中所有数据元素。(2)在递增有序的单链表中插入一个新结点x,保持单链表的有序性。 解题思路:首先查找插入的位置然后进行插入操作;从第一个结点开始找到第一个大于该新结点值的结点即为插入位置;然后在找到的此结点之前插入新结点;注意保留插入位置之前结点的指针才能完成插入操作。 (3)编写实现带头结点单链表就地逆置的子函数,并编写主函数测试结果。 2、选做题 已知指针LA和LB分别指向两个无头结点单链表的首元结点。要求编一算法实现,从表LA中删除自第i个元素起共len个元素后,将它们插入到表LB中第j个元素之前。程序清单: 1.(1) #include 金陵科技学院实验报告 { } void display(list *head){ list *rear;if(head==NULL){ } } main(){ list *head;head=setup(s);display(head);free(s);rear=head;printf(“%c”,rear->a);while(rear->next!=NULL){ } rear=rear->next;printf(“%c”,rear->a);printf(“没有数据n”);else list *head=NULL;list *rear=NULL; char c;printf(“请输入c直到$n”);c=getchar();while(c!='$'){ } if(rear!=NULL)rear->next=NULL;return head;s=malloc(sizeof(list));s->a=c;if(head==NULL){ } else rear->next=s;rear=s;c=getchar();head=s; 金陵科技学院实验报告 } free(head);1.(2)#include } void paixu(list *head){ list *rear;list *p;datatype min;if(head==NULL){ list *head=NULL;list *rear=NULL; char c;printf(“请输入c直到$n”);c=getchar();while(c!='$'){ } if(rear!=NULL)rear->next=NULL;return head;s=malloc(sizeof(list));s->a=c;if(head==NULL){ } else rear->next=s;rear=s;c=getchar();head=s; 金陵科技学院实验报告 } void insert(list *head,datatype x){ list *p;list *q;list *r;if(head==NULL)printf(“空表n”);p=head;q=head;r=malloc(sizeof(list));r->a=x;while(p->next!=NULL){ } while(q->next!=p)q=q->next;r->next=p;q->next=r;if(p->next==NULL)if(x a){ } p=p->next;break;} p=head; while(p->next!=NULL){ do { rear=rear->next;if(min>rear->a){ } min=rear->a;rear->a=p->a;p->a=min; min=p->a;rear=p;printf(“空表!n”);exit(0);} while(rear->next!=NULL);p=p->next;} 金陵科技学院实验报告 } void display(list *head){ list *rear;if(head==NULL){ } } main(){ } datatype x,c;list *head;head=setup(s);paixu(head);printf(“请输入xn”);c=getchar();x=getchar();insert(head,x);display(head);free(s);free(head);rear=head;printf(“%c”,rear->a);while(rear->next!=NULL){ } rear=rear->next;printf(“%c”,rear->a);printf(“没有数据n”);else p->next=r;1.(3)#include 金陵科技学院实验报告 list *setup(list *s){ } list *nizhi(list *head){ list *h;list *rear;int i=0;char b[100];h=malloc(sizeof(list));h->next=head;rear=head;do { b[i]=rear->a;rear=rear->next;i++;list *head=NULL;list *rear=NULL; char c;printf(“请输入c直到$n”);c=getchar();while(c!='$'){ } if(rear!=NULL)rear->next=NULL;return head;s=malloc(sizeof(list));s->a=c;if(head==NULL){ } else rear->next=s;rear=s;c=getchar();head=s;}while(rear->next!=NULL);b[i]=rear->a;rear=head;for(;i>=0;i--){ } rear->a=b[i];rear=rear->next; 金陵科技学院实验报告 } void display(list *head){ list *rear;if(head==NULL){ } } main(){ } list *head;head=setup(s);head=nizhi(head);display(head);free(s);free(head);rear=head;printf(“%c”,rear->a);while(rear->next!=NULL){ } rear=rear->next;printf(“%c”,rear->a);printf(“没有数据n”);else return head;2.#include list *head=NULL;list *rear=NULL; char c;printf(“请输入c直到$n”);c=getchar();while(c!='$') 金陵科技学院实验报告 } void dein(list *LA,list *LB,int i,int len,int j){ int k;list *rear;list *t;list *h;list *r;list *q;h=NULL;rear=LA;q=LA;for(k=1;k!=i;k++){ } while(q->next!=rear){ t=malloc(sizeof(list));t->a=rear->a;if(h==NULL)h=t;q=q->next;for(k=1;k<=len;k++)rear=rear->next;if(rear->next==NULL&&k!=i){ } printf(“没找到i的位置n”);exit(0); { } if(rear!=NULL)rear->next=NULL;return head;s=malloc(sizeof(list));s->a=c;if(head==NULL){ } else rear->next=s;rear=s;c=getchar();head=s; 金陵科技学院实验报告 } void display(list *head){ list *rear;if(head==NULL){ rear=head;printf(“%c”,rear->a);while(rear->next!=NULL){ } printf(“n”);rear=rear->next;printf(“%c”,rear->a);printf(“没有数据n”);else } q->next=rear;if(r!=NULL)r->next=NULL;rear=LB;for(k=1;k!=j;k++){ } q=LB;while(q->next!=rear)q=q->next;r->next=rear;q->next=h;rear=rear->next;if(rear->next==NULL&&k!=j){ } printf(“没找到j的位置n”);exit(0);else r->next=t;r=t;rear=rear->next;if(rear->next==NULL&&k } printf(“len太长n”);exit(0); 金陵科技学院实验报告 } } main(){ char c; } list *LA;list *LB;int i,len,j;printf(“建立单链表LAn”);LA=setup(s1);printf(“建立单链表LBn”);LB=setup(s2);printf(“请输入要删的位置in”);scanf(“%d”,&i);printf(“请输入要删减的数据长度lenn”);scanf(“%d”,&len);printf(“请输入要插入的位置jn”);scanf(“%d”,&j);dein(LA,LB,i,len,j);printf(“显示LAn”);display(LA);printf(“显示LBn”);display(LB);free(LA);free(LB);c=getchar(); 金陵科技学院实验报告 四、实验结果与分析(程序运行结果及其分析)1.(1) 金陵科技学院实验报告 1.(2) 1.(3) 金陵科技学院实验报告 2.金陵科技学院实验报告 五、实验体会(遇到问题及解决办法,编程后的心得体会) 单链表以前没怎么编过,所以现在编有点陌生,要编译好几次才能运行。我觉得还是不能光看书,还要多编几道题比较有手感。 金陵科技学院实验报告 实验项目名称: 堆栈和队列 实验学时: 2 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间: 金陵科技学院实验报告 实验3 堆栈和队列 一、实验目的和要求 (1)掌握应用栈解决问题的方法。(2)掌握利用栈进行表达式求和的算法。 (3)掌握队列的存储结构及基本操作实现,并能在相应的应用问题中正确选用它们。 二、实验仪器和设备 Turbo C 2.0 三、实验内容与过程(含程序清单及流程图) 1、必做题 (1)判断一个算术表达式中开括号和闭括号是否配对。(2)测试“汉诺塔”问题。 (3)假设称正读和反读都相同的字符序列为”回文”,试写一个算法判别读入的一个以’@’为结束符的字符序列是否是“回文”。 2、选做题 在顺序存储结构上实现输出受限的双端循环队列的入列和出列算法。设每个元素表示一个待处理的作业,元素值表示作业的预计时间。入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。程序清单: 1.(1) #include int i,k,count1=0,count2=0;for(i=0;a[i]!='';i++){ { count1++;for(k=i+1;a[k]!='';k++){ if(a[k]==')')if(a[i]=='(') 金陵科技学院实验报告 } main(){ } printf(“请输入算式n”);gets(a);if(panduan(a)==1){ } else printf(“算式()不配对n”);printf(“算式()配对n”); break;} if(a[k]=='')return 0;} if(a[i]==')')} if(count1!=count2)return 0;return 1;count2++;1.(2) #include } main(){ if(n==1){ } hanno(n-1,a,c,b);move(n,a,c);hanno(n-1,b,a,c);move(1,a,c);else 金陵科技学院实验报告 } int n;char a,b,c;printf(“请输入要移动的盘子数n”);scanf(“%d”,&n);a='A';b='B';c='C';hanno(n,a,b,c);1.(3) #include } main(){ while(1){ printf(“请输入字符直到@n”);gets(s);if(huiwen(s)) } printf(“是回文n”);printf(“不是回文n”);else int i,j=0;char b[100];for(i=0;s[i]!='@';i++);for(i=i-1;i>=0;i--){ } j=0;for(i=0;s[i]!='@';i++){ } return 1;return 0;b[j]=s[i];j++;if(s[i]!=b[j])j++; 金陵科技学院实验报告 } 2.#include int a[maxsize];int head;int rear;}dui;dui *s;void init(dui *s){ } void setup(dui *s,int x){ if(x<((s->a[s->head]+s->a[s->rear])/2)){ } else { s->rear=(s->rear++)%maxsize;s->head=(s->head--)%maxsize;s->a[s->head]=x;s->head=maxsize-1;s->rear=maxsize-1;s->a[s->head]=0;s->a[s->rear]=0; 金陵科技学院实验报告 } } s->a[s->rear]=x;void display(dui *s){ printf(“s队为:”);while(s->head==s->rear){ printf(“%-3d”,s->a[s->head]); } main(){ } int x;while(1){ printf(“请输入x直到0n”);scanf(“%d”,&x);setup(s,x);if(x==0)} if(s->head!=(s->rear+1)%maxsize)printf(“队满n”);display(s);break;} s->head=(s->head++)%maxsize; 金陵科技学院实验报告 四、实验结果与分析(程序运行结果及其分析)1.(1) 金陵科技学院实验报告 1.(2) 1.(3) 金陵科技学院实验报告 五、实验体会(遇到问题及解决办法,编程后的心得体会) 金陵科技学院实验报告 实验项目名称: 串 实验学时: 2 同组学生姓名: 实验地点: 实验日期: 实验成绩: 批改教师: 批改时间: 金陵科技学院实验报告 实验4 串 一、实验目的和要求 掌握串的存储及应用。 二、实验仪器和设备 Turbo C 2.0 三、实验内容与过程(含程序清单及流程图) 1、必做题 (1)编写输出字符串s中值等于字符ch的第一个字符的函数,并用主函数测试结果。 (2)编写输出字符串s中值等于字符ch的所有字符的函数,并用主函数测试结果。 解题思路:可以将第一题程序改进成一个子函数,在本题中循环调用。(3)设字符串采用单字符的链式存储结构,编程删除串s从位置i开始长度为k的子串。 2、选做题 假设以链结构表示串,编写算法实现将串S插入到串T中某个字符之后,若串T中不存在这个字符,则将串S联接在串T的末尾。 提示:为提高程序的通用性,插入位置字符应设计为从键盘输入。程序清单: 1.(1) #include int i;for(i=0;s[i]!='';i++){ } printf(“没找到n”);if(ch==s[i]){ } printf(“找到字符%c在位置%dn”,s[i],i+1);exit(0); 金陵科技学院实验报告 } main(){ } char s[100],ch;printf(“请输入字符串sn”);gets(s);printf(“请输入要查找的字符chn”);scanf(“%c”,&ch);fun(s,ch);1.(2) #include } main(){ char ch;printf(”请输入字符串sn“);gets(s);printf(”请输入要查找的chn“);scanf(”%c“,&ch);fun(s,ch);} if(ch==s[i])printf(” %c“,s[i]);} 1.(3) 金陵科技学院实验报告 #include } void delet(chuan *chu,int i,int k){ int j;chuan *p;chuan *t;if(chu==NULL){ } p=chu;for(j=1;j } if(rear!=NULL)rear->next=NULL;return head;rear->next=s;rear=s;head=s;s=malloc(sizeof(chuan));ch=getchar(); 金陵科技学院实验报告 } void display(chuan *chu){ chuan *p; } main(){ int i,k;chuan *head;head=setup(s);printf(”请输入要删除字符的位置in“);scanf(”%d“,&i);p=chu;if(chu==NULL){ } printf(”%c“,p->c);while(p->next!=NULL){ } p=p->next;printf(”%c“,p->c);printf(”空串n“);exit(0);{ } t=p->next;for(j=1;j } p->next=t;if(p->next==NULL&&j } t=t->next;printf(”串长度太小,无法删除%d个元素n“,k);exit(0);if(p->next==NULL&&j } p=p->next;printf(”无法找到第%d位置n“,i);exit(0); 金陵科技学院实验报告 printf(”请输入要删除字符的个数kn“);scanf(”%d“,&k);delet(head,i,k);display(head);free(head);free(s);} 2.#include chuan *head=NULL;chuan *rear=NULL;char ch;printf(”请输入字符ch直到$n“);ch=getchar();while(ch!='$'){ chu=malloc(sizeof(chuan)); chu->c=ch;if(head==NULL){ head=chu; 金陵科技学院实验报告 } } else rear->next=chu;rear=chu;ch=getchar();} if(rear!=NULL)rear->next=NULL;return head; void insert(chuan *s1,chuan *s2,char x){ chuan *p;chuan *q;p=s1;if(s1==NULL){ } { } while(p->next!=NULL){ if(p->c==x)break;printf(”s是空串n“);exit(0);if(s2==NULL)printf(”t是空串n“);exit(0); 金陵科技学院实验报告 } } p=p->next;if(p->next==NULL)p->next=s2;else { } q=s2;while(q->next!=NULL)q=q->next;q->next=p->next;p->next=s2;void display(chuan *chu){ chuan *p; } p=chu;if(chu==NULL){ } printf(”%c“,p->c);while(p->next!=NULL){ } p=p->next;printf(”%c“,p->c);printf(”空串n“);exit(0); 金陵科技学院实验报告 main(){ char x,c;printf(”建立单链串tn“);t=setup(t);c=getchar();printf(”建立单链串sn“);s=setup(s);c=getchar();printf(”请输入要在什么字符后插入n");x=getchar(); } insert(t,s,x);display(t);