数据结构课程设计心得体会精品多篇范文
寄语:数据结构课程设计心得体会精品多篇为好范文网的会员投稿推荐,但愿对你的学习工作带来帮助。
数据结构课程设计 篇一
《数据结构》
课程设计报告
学 号 姓 名 班 级 指导教师
XXX XXX XXX XXX 安徽工业大学计算机学院
2014年6月
利用栈实现迷宫问题的求解
一、问题描述
以一个M*N的长方阵表示迷宫,0和1分别表示迷宫中的通路和墙壁。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出米有通路的结论。
二、设计思路
(1)以二维数组maze[m][n]表示迷宫,数组中元素值为0表示通路,1表示障碍。
(2)其中迷宫的入口位置和出口位置默认于maze数组的起始元素位置和最后个元素位置。
(3)以链表作存储结构的栈类型,实现求解迷宫的非递归程序。
三、数据结构定义 typedef struct{
int x; int y; }item; typedef struct{ int x,y,d; }DataType; typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;
typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;
四、程序清单 #include
typedef struct{
{1,0,1,1,1,0,1,1,1,1}, {1,0,0,0,0,1,1,1,1,1}, {1,0,1,0,0,0,0,0,1,1}, {1,0,1,1,1,0,0,1,1,1}, {1,1,0,0,1,1,0,0,0,1}, {1,0,1,1,0,0,1,1,0,1}, {1,1,1,1,1,1,1,1,1,1}}; int x; int y; }item;
item move[4]={{0,1},{1,0},{0,-1},{-1,0}};
typedef struct{ int x,y,d; }DataType;
typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;
PSeqStack Init_SeqStack() {
} PSeqStack p; p=(PSeqStack)malloc(sizeof(SeqStack)); if(p) p->top=-1; return p;
int Empty_SeqStack(PSeqStack p) {
}
int Push_SeqStack(PSeqStack p,DataType x) {
}
int Pop_SeqStack(PSeqStack p,DataType *x) { if(p->top==999) return 0; if(p->top==-1) return 1; else return 0; else {
} p->top++; p->data[p->top]=x; return 1;
} if(Empty_SeqStack(p)) return 0; else {
} *x=p->data[p->top]; p->top--; return 1; void Destroy_SeqStack(PSeqStack *p) {
}
int mazepath(int maze[][n+2],item move[],int x0,int y0) {
PSeqStack S; DataType temp; int x,y,d,i,j; if(*p) free(*p); *p=NULL; return;
temp.x=x0; temp.y=y0; temp.d=-1; S=Init_SeqStack(); if(!S) {
} Push_SeqStack(S,temp); while(!Empty_SeqStack(S)) {
Pop_SeqStack(S,&temp); x=temp.x; y=temp.y; d=temp.d+1; while(d<4) {
i=x+move[d]。x; j=y+move[d]。y; if(0==maze[i][j]) { temp.x=x; printf(“栈初始化失败!!!”); return 0;
}
}
} temp.y=y; temp.d=d; Push_SeqStack(S,temp); x=i; y=j; maze[x][y]=-1; if(x==m&&y==n) {
} else d=0; while(!Empty_SeqStack(S)) {
} Destroy_SeqStack(&S); return 1; Pop_SeqStack(S,&temp); printf(“(%d,%d)<-”,temp.x,temp.y); else d++;
} Destroy_SeqStack(&S); return 0; int main() {
}
五、运行及调试分析 mazepath(maze,move,1,1); return 0;
六、课程设计总结等
在做实验前,一定要将课本上的知识吃透,因为这是做实验的基础,否则,在做设计程序实验时,这将使你做的难度加大,浪费宝贵的时间。使你事倍功半。做实验时,一定要亲力亲为,务必要将每个步骤,每个细节弄清楚,弄明白,实验后,还要复习,思考,这样,你的印象才深刻,记得才牢固,否则,过后不久你就会忘得一干二净,这还不如不做。通过这次程序设计的实验,使我们学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们们受益匪浅。
大数相乘
一、问题描述
本问题中,要求输入两个相对较大的正整数,能够通过程序计算出其结果
二、设计思路
1、输入阶段采用一维数组a[],b[] 在输入阶段当大数输入时,大数a,b从高位到低位分别依次存入数组a[ ],b[ ]。
2、调用函数计算阶段采用一维数组c[ ] 在计算过程中,由个位到高位依次计算各位的结果,并依次存入数组c[ ]中。
三、数据结构定义
int x[N],y[N],z[N*N];
四、程序清单 #include 五、运行及调试分析 六、课程设计总结。 回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。 数据结构课程设计 1、赫夫曼编码器 设计一个利用赫夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。 要求: 1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中) 2) 初始化:键盘输入字符集大小26、26个字符和26个权值(统计一篇英文文章中26个字母),建立哈夫曼树; 3) 编码:利用建好的哈夫曼树生成哈夫曼编码; 4) 输出编码(首先实现屏幕输出,然后实现文件输出); 5) 界面优化设计。 代码如下: #include typedef struct HTNode //结构体 { int Weight; char ch; int Parent,Lchild,Rchild; }HTNode; typedef char * * HCode; void Save(int n,HTNode *HT) //把权值保存到文件 { FILE * fp; int i; if((fp=fopen(“data.txt”,“wb”))==NULL) { printf(“cannot open filen”); return; } for(i=0;i if(fwrite(&HT[i]。Weight,sizeof(struct HTNode),1,fp)!=1) printf(“file write errorn”); fclose(fp); system(“cls”); printf(“保存成功!”); } void Create_H(int n,int m,HTNode *HT) //建立赫夫曼树,进行编码 { int w,k,j; char c; for(k=1;k<=m;k++) { if(k<=n) { printf(“n请输入权值和字符(用空格隔开): ”); scanf(“%d”,&w); scanf(“ %c”,&c); HT[k]。ch=c; HT[k]。Weight=w; } else HT[k]。Weight=0; HT[k]。Parent=HT[k]。Lchild=HT[k]。Rchild=0; } int p1,p2,w1,w2; for(k=n+1;k<=m;k++) { p1=0;p2=0; w1=32767;w2=32767; for(j=1;j<=k-1;j++) { if(HT[j]。Parent==0) { if(HT[j]。Weight { w2=w1;p2=p1; w1=HT[j]。Weight; p1=j; } else if(HT[j]。Weight { w2=HT[j]。Weight; p2=j; } } } HT[k]。Lchild=p1;HT[k]。Rchild=p2; HT[k]。Weight=HT[p1]。Weight+HT[p2]。Weight; HT[p1]。Parent=k;HT[p2]。Parent=k; } printf(“输入成功!”); } void Coding_H(int n,HTNode *HT) //对结点进行译码 { int k,sp,fp,p; char *cd; HCode HC; HC=(HCode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char)); cd[n-1]=''; printf(“************************n”); printf(“Char Codingn”); for(k=1;k<=n;k++) { sp=n-1;p=k;fp=HT[k]。Parent; for(;fp!=0;p=fp,fp=HT[fp]。Parent) if(HT[fp]。Lchild==p) cd[--sp]='0'; else cd[--sp]='1'; HC[k]=(char *)malloc((n-sp)*sizeof(char)); strcpy(HC[k],&cd[sp]); printf(“%c %sn”,HT[k]。ch,HC[k]); } printf(“************************n”); free(cd) ; } void Read(int n,HTNode *HT) //从文件中读出数据 { int i; FILE * fp; if((fp=fopen(“data.txt”,“rb”))==NULL) { printf(“cannot open filen”); exit(0); } for(i=0;i fread(&HT[i]。Weight,sizeof(struct HTNode),1,fp); // printf(“%d n”,HT[i]。Weight); } Coding_H(n,HT); fclose(fp); } void Print_H(int m,HTNode *HT) //输出赫夫曼造树过程 { int k; printf(“************************n”); printf(“Num Weight Par LCh RCh n”); for(k=1;k<=m;k++) { printf(“%d ”,k); printf(“ %d”,HT[k]。Weight); printf(“ %d”,HT[k]。Parent); printf(“ %d”,HT[k]。Lchild); printf(“ %dn”,HT[k]。Rchild); } printf(“************************n”); } void Decode(int m,HTNode *HT) //对输入的电文进行译码 { int i,j=0; char a[10]; char endflag='2'; i=m; printf(“输入发送的编码,以‘2’结束:”); scanf(“%s”,&a); printf(“译码后的字符:”); while(a[j]!='2') { if(a[j]=='0') i=HT[i]。Lchild; else i=HT[i]。Rchild; if(HT[i]。Lchild==0) //HT[i]是叶结点 { printf(“%c”,HT[i]。ch); i=m; //回到根结点 } j++; } printf(“n”); if(HT[i]。Lchild!=0&&a[j]!='2') printf(“ERROR”); } int main() //主函数 { int n,m,c; HTNode HT[N]; do { system(“color 2f”); //运行环境背景颜色。 printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt 赫夫曼编译码系统 ttt”); printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt1.输入权值、字母nttt2.把数据写入文件nttt3.输出赫夫曼编码表nttt”); printf(“4.输出赫夫曼译码表nttt5.输入编码并译码。nttt6.从文件中读出数据nttt7.退出”); printf(“nnttt请选择:”); scanf(“%d”,&c); switch(c) { case 1:system(“cls”);printf(“输入多少结点:”); scanf(“%d”,&n);m=2*n-1;Create_H(n,m,HT);break; case 2:system(“cls”);Save(n,HT);break; case 3:system(“cls”);Print_H(m,HT);break; case 4:system(“cls”);Coding_H(n,HT);break; case 5:system(“cls”);Decode(m,HT);break; case 6:system(“cls”);Read(n,HT);break; case 7:system(“cls”);exit(0); } }while(1); return 0; } 运行界面如下: 2、学生成绩管理(链表实现) 要求: 实现如下功能:增加、查找、删除、输出、退出。 代码如下: #include //定义成绩信息结构体 { char Number[20]; char Name[20]; char Chinese[20]; char English[20]; char Math[20]; }score; typedef struct node_score //定义成绩信息链表结点,包括数据域和指针域 { score data; struct node_score *next; }node_score,*p_node_score; p_node_score headScore;//定义链表的头指针为全局变量 void PrintScore(score s) //输出信息函数 { printf(“ %10s”,s.Number); printf(“ | %-6s”,s.Name); printf(“ | %-3s”,s.Chinese); printf(“ | %-3s”,s.English); printf(“ | %-3sn”,s.Math); } void View()//输出函数 { p_node_score pNodeScore; pNodeScore=headScore; printf(“ 学号 | 姓名 | 语文成绩 | 英语成绩| 高数成绩n”); while(pNodeScore != NULL) { PrintScore(pNodeScore->data);//输出学生信息和成绩信息 pNodeScore=pNodeScore->next; } } void Add() { p_node_score pNodeScore; // 定义一个节点 pNodeScore=(p_node_score)malloc(sizeof(node_score));//为节点分配存储空间 printf(“请输入学号:”); scanf(“%s”,pNodeScore->data.Number); printf(“请输入姓名:”); scanf(“%s”,pNodeScore->data.Name); printf(“请输入语文成绩:”); scanf(“%s”,pNodeScore->data.Chinese); printf(“请输入英语成绩:”); scanf(“%s”,pNodeScore->data.English); printf(“请输入高数成绩:”); scanf(“%s”,pNodeScore->data.Math); if(headScore==NULL) { //如果头结点为空 headScore=pNodeScore; pNodeScore->next=NULL; } else { //如果头结点不为空 pNodeScore->next=headScore; headScore=pNodeScore;//将头结点新结点 } } void Input() { int n,i; printf(“输入几个学生的数据:”); scanf(“%d”,&n); for(i=0;i Add(); printf(“输入成功!”); } int Delete() { p_node_score pNodeScore,p1; //p1为pNodeScore的前驱 p1=headScore; if(p1==NULL) { printf(“成绩表中没有数据!请先添加数据!n”); return 0; } char DeleteNumber[20]; printf(“请数入要删除的学生学号:”); scanf(“%s”,DeleteNumber); if(strcmp(p1->data.Number,DeleteNumber)==0) { //如果要删除的结点在第一个 headScore=p1->next; pNodeScore=p1; printf(“学号为%s的学生信息已经删除!n”,DeleteNumber); return 0; } else { pNodeScore=p1->next; while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,DeleteNumber)==0) { p1->next=pNodeScore->next; printf(“学号为%s的学生信息已经删除!n”,DeleteNumber); return 0; } else { //否则,结点向下一个,p1仍为pNodeScore的前驱 p1=pNodeScore; pNodeScore=pNodeScore->next; } } } printf(“没有此学号的学生!”); } int Change() { p_node_score pNodeScore; pNodeScore=headScore; if(pNodeScore==NULL) { printf(“成绩表中没有数据!请先添加数据!n”); return 0; } char EditNumber[20]; printf(“请输入你要修改的学生学号:”); scanf(“%s”,EditNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,EditNumber)==0) { //用strcmp比较两字符串是否相等,相等则返回0 printf(“原来的学生成绩信息如下:n”); //输出原来的成绩信息 printf(“ 学号 | 姓名 | 语文成绩 | 英语成绩| 高数成绩n”); PrintScore(pNodeScore->data); printf(“语文新成绩:”); scanf(“%s”,pNodeScore->data.Chinese); printf(“英语新成绩:”); scanf(“%s”,pNodeScore->; printf(“高数新成绩:”); scanf(“%s”,pNodeScore->data.Math); printf(“成绩已经修改!”); return 0; } pNodeScore=pNodeScore->next; //如果不相等,pNodeScore则指向下一个结点 } printf(“没有此学号的学生!n”); //如果找到最后都没有,则输出没有此学号的学生 } int Find() { p_node_score pNodeScore; pNodeScore=headScore; if(pNodeScore==NULL) { printf(“成绩表中没有数据!请先添加数据!n”); return 0; } char FindNumber[20]; printf(“请输入你要查找的学生学号:”); scanf(“%s”,FindNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->data.Number,FindNumber)==0) { printf(“你要查找的学生成绩信息如下:n”); printf(“ 学号 | 姓名 | 语文成绩 | 英语成绩| 高数成绩n”); PrintScore(pNodeScore->data); return 0; } pNodeScore=pNodeScore->next; } printf(“没有此学号的学生!n”); } int main() //主函数 { int choice=0; headScore=NULL; int c; do { system(“color 2f”); //运行环境背景颜色。 printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt 学生成绩管理系统 ttt”); printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt1.输入成绩信息nttt2.输出成绩信息nttt3.添加成绩信息nttt”); printf(“4.修改成绩信息nttt5.删除成绩信息nttt6.查询成绩信息nttt7.退出”); printf(“nnttt请选择:”); scanf(“%d”,&c); switch(c) { case 1:system(“cls”);Input();break; case 2:system(“cls”);View();break; case 3:system(“cls”);Add();break; case 4:system(“cls”);Change();break; case 5:system(“cls”);Delete();break; case 6:system(“cls”);Find();break; case 7:system(“cls”);exit(0); } }while(1); return 0; } 运行界面如下: 本次课程设计所用到的知识完全是上学期的知识,通过这次课程设计,我认识到了我对数据结构这门课的掌握程度。 首先我这个课程设计是关于二叉树的,由于是刚接触二叉树,所以我掌握的长度并不深。在编程之前我把有关于二叉树的知识有温习了一遍,还好并没有忘掉。二叉树这章节难度中上等,而且内容广泛,所以我只掌握了百分之六七十。 然后,在编程中我认识到了自己动手能力的不足,虽然相比较大二而言进步很大,但是我还是不满意,有的在编程中必须看书才能写出来,有的靠百度,很少是自己写的。还好,我自己组装程序的能力还行,要不这东拼西凑的程序根本组装不了。在编程中我还认识到了,编程不能停下,如果编程的时间少了,知识忘的会很快,而且动手也会很慢。同时,同学之间的合作也很重要,每个人掌握的知识都不一样,而且掌握程度也不一样,你不会的别的同学会,所以在大家的共同努力下,编程会变得很容易。在这次编程中,我了解到了自己某些方面的不足,比如说链表的知识,虽然我能做一些有关于链表的编程,但是很慢,没有别人编程的快,另外,二叉树和图的知识最不好掌握,这方面的知识广泛而复杂。以前,没动手编程的时候觉得这些知识很容易,现在编程了才发现自己错了,大错特错了,我们这个专业最重视的就是动手编程能力,如果我们纸上写作能力很强而动手编程能力很差,那我们就白上这个专业了。计算机这个专业就是锻炼动手编程能力的,一个人的理论知识再好,没有动手编程能力,那他只是一个计算机专业的“入门者”。在编程中我们能找到满足,如果我们自己编程了一个程序,我们会感到自豪,而且充实,因为如果我们专研一个难得程序,我们会达到忘我的境界,自己完全沉浸在编程的那种乐趣之中,完全会废寝忘食。编程虽然会乏味很无聊,但是只要我们沉浸其中,你就会发现里面的乐趣,遇到难得,你会勇往直前,不写出来永不罢休;遇到容易的,你会找到乐趣。编程是很乏味,但是那是因为你没找到编程重的乐趣,你只看到了他的不好,而没有看到他的好。其实,只要你找到编程中得乐趣,你就会完全喜欢上他,不编程还好,一编程你就会变成一个两耳不闻窗外事的“植物人”。可以说只要你涉及到了计算机,你就的会编程,而且还要喜欢上他,永远和他打交道,我相信在某一天,我们一定会把他当作我们不可或缺的好朋友。 本次课程设计,使我对《数据结构》这门课程有了更深入的理解。我的课程设计题目是线索二叉树的运算。刚开始做这个程序的时候,感到完全无从下手,甚至让我觉得完成这次程序设计根本就是不可能的,于是开始查阅各种资料以及参考文献,之后便开始着手写程序,写完运行时有很多问题。特别是实现线索二叉树的删除运算时很多情况没有考虑周全,经常运行出现错误,但通过同学间的帮助最终基本解决问题。 在本课程设计中,我明白了理论与实际应用相结合的重要性,并提高了自己组织数据及编写大型程序的能力。培养了基本的、良好的程序设计技能以及合作能力。这次课程设计同样提高了我的综合运用所学知识的能力。并对VC有了更深入的了解。《数据结构》是一门实践性很强的课程,上机实习是对学生全面综合素质进行训练的一种最基本的方法,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。上机实习一方面能使书本上的知识变“活”,起到深化理解和灵活掌握教学内容的目的;另一方面,上机实习是对学生软件设计的综合能力的训练,包括问题分析,总体结构设计,程序设计基本技能和技巧的训练。此外,还有更重要的一点是:机器是比任何教师更严厉的检查者。因此,在“数据结构”的学习过程中,必须严格按照老师的要求,主动地、积极地、认真地做好每一个实验,以不断提高自己的编程能力与专业素质。 通过这段时间的课程设计,我认识到数据结构是一门比较难的课程。需要多花时间上机练习。这次的程序训练培养了我实际分析问题、编程和动手能力,使我掌握了程序设计的基本技能,提高了我适应实际,实践编程的能力。 总的来说,这次课程设计让我获益匪浅,对数据结构也有了进一步的理解和认识。 通过两周的课程设计,完成了预定的目标,其中有很多的随想。老师的题目发下来的很早,大概提前了3周,当时就着手搜索有关线索二叉树的思想,思路,借了一本《数据结构-c语言描述》,在大体上就有了一个轮廓,先是输入二叉树,在对二叉树进行线索化,依次往下,但在具体实现时,遇到了很多问题:首先是思想的确定,其非常重要,以前有了这个想法,现在愈加清晰起来,因此,花了大量的时间在插入删除的具体操作设计上,大概三个晚上的时间,对其中什么不清晰明确之处均加以推敲,效果是显著的,在上机上相应的节约了时间。 通过具体的实验编码,思路是对的,但是在小问题上摔了一次又一次,大部分时间都是花在这方面,这个节点没传过来啊之类的,以后应该搞一个小册子,记录一些错误的集合,以避免再犯,思想与C语言联系起来,才是我们所需要的,即常说的理论与实践的关系。 数据结构是基础的一门课,对于有过编程经验的人,结合自己的编程体会去悟它的思想;而且我觉得随着编程经历的丰富对它的体会越深入,最初接触是对一些思想可能只是生硬的记忆,随着学习的深入逐渐领悟了很多。看了这次课程设计的题目,虽然具体要求没有看清,但是总结一下,可以看出,其需要我们能把一个具体案例或一件事情反映为程序来表达,数据结构就是桥梁,通过自己的设计,使应用能力得以融汇,对与问题,具有了初步的分析,继而解决之的能力,感觉对以后的学习会有很大的`帮助,学习无非是用于实践。 认识到自己的不足,希望能有进一步的发展。 一,课程题目 (算符优先法计算算数表达式)以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教材表3.1(P53)给出的算符优先关系,实现对于算术四则混合运算(加、减、乘、除)表达式的求值。例如:7+(4-2)*3+12/2=19。注:按照四舍五入的方式将四则运算结果取整。 二,程序设计思想 在程序中分别设立一个运算符栈(OPTR 栈),用于存储‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用于判断算术表达式结束),和一个操作数栈(OPND 栈),用于存放整数,输入算式后,先将数字与运算符分开入i栈,若为数字则先用转换函数将char类型的数转换为int型并进入操作数栈,若为运算符则根据教材表3.1(P53)给出的算符优先级关系,判断栈顶运算符和从键盘取得的运算符作优先级比较,若取得的运算符优先级高则进栈,直到取得运算符优先级低的,则将操作数取出作operate运算后存入栈顶,反复操作知道遇到‘#’,则结束运算,输出栈顶元素即为结果。 三,程序流程图 四,程序关键代码设计 本次程序设计共调用了12个方法分别是: InitNumStack,ParseInt,PushNum,PopNum ,InitCalStack,PopCal ,PushCal,In,GetTopCal,GetTopNum,Preced,Operate。 其中 ParseInt方法 int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){ number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10 *number[3]+number[4]; return i; } 为将输入的数字字符型转换为整型的转换函数,通过Ascall表的转换关系,将输入的字符型数字转换为整型。在入栈前进行此方法,以便整型数的计算。 Preced,Operate函数 char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; int Operate (int a,char theta,int b){ int c ; if (theta=='+'){ c=a+b; return c; } if (theta=='-'){ c=a-b; return c; } if (theta=='*'){ c=a*b; return c; } if (theta=='/'){ c=a/b; return c; } return 0; } 其中preced是判定运算符栈的栈顶运算符C1与读入的运算符C2之间优先关系函数;Opearte为进行二元运算aCb的函数,如果是编译表达式,则产生这个运算的一组相应的指令并返回存放结果的中间变量名;如果是解释执行表达式,则直接进行该运算,并返回运算结果。 五,程序源代码以及运行结果 #include number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10*number[3]+number[4]; return i; } void PushNum(SqlNum &S,int c){ *S.top=c; S.top++; } int PopNum(SqlNum &S){ int c; S.top--; c=*S.top; return c; } typedef struct{ char *base; char *top; int Stacksize; }SqlCal; void InitCalStack(SqlCal &S){ S.base=(char *)malloc(100*sizeof(char)); S.top=S.base; S.Stacksize=100; } void PushCal(SqlCal &S,char c){ *S.top=c; S.top++; } char PopCal(SqlCal &S){ char c; S.top--; c=*S.top; return c; } int In(char c,char s[]){ int i; for(i=0;i if(c==s[i]) return 1; return 0; } char GetTopCal(SqlCal &s){ char c; c=*(s.top-1); return c; } int GetTopNum(SqlNum &s){ int c; c=*(s.top-1); return c; } char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; if(a=='+'){ if(b=='+'){ return d[0][0];} if(b=='-'){ return d[0][1];} if(b=='*'){ return d[0][2];} if(b=='/'){ return d[0][3];} if(b=='('){ return d[0][4];} if(b==')'){ return d[0][5];} if(b=='#'){ return d[0][6];} } if(a=='-'){ if(b=='+'){ return d[1][0];} if(b=='-'){ return d[1][1];} if(b=='*'){ return d[1][2];} if(b=='/'){ return d[1][3];} if(b=='('){ return d[1][4];} if(b==')'){ return d[1][5];} if(b=='#'){ return d[1][6];} } if(a=='*'){ if(b=='+'){ return d[2][0];} if(b=='-'){ return d[2][1];} if(b=='*'){ return d[2][2];} if(b=='/'){ return d[2][3];} if(b=='('){ return d[2][4];} if(b==')'){ return d[2][5];} if(b=='#'){ return d[2][6];} } if(a=='/'){ if(b=='+'){ return d[3][0];} if(b=='-'){ return d[3][1];} if(b=='*'){ return d[3][2];} if(b=='/'){ return d[3][3];} if(b=='('){ return d[3][4];} if(b==')'){ return d[3][5];} if(b=='#'){ return d[3][6];} } if(a=='('){ if(b=='+'){ return d[4][0];} if(b=='-'){ return d[4][1];} if(b=='*'){ return d[4][2];} if(b=='/'){ return d[4][3];} if(b=='('){ return d[4][4];} if(b==')'){ return d[4][5];} if(b=='#'){ return d[4][6];} } if(a==')'){ if(b=='+'){ return d[5][0];} if(b=='-'){ return d[5][1];} if(b=='*'){ return d[5][2];} if(b=='/'){ return d[5][3];} if(b=='('){ return d[5][4];} if(b==')'){ return d[5][5];} if(b=='#'){ return d[5][6];} } if(a=='#'){ if(b=='+'){ return d[6][0];} if(b=='-'){ return d[6][1];} if(b=='*'){ return d[6][2];} if(b=='/'){ return d[6][3];} if(b=='('){ return d[6][4];} if(b==')'){ return d[6][5];} if(b=='#'){ return d[6][6];} } return 0; } int Operate (int a,char theta,int b){ int c ; if (theta=='+'){ c=a+b; return c; } if (theta=='-'){ c=a-b; return c; } if (theta=='*'){ c=a*b; return c; } if (theta=='/'){ c=a/b; return c; } return 0; } void main(){ SqlCal OPTR; SqlNum OPND; char c,d[5]={'0','0','0','0','0'}; int f=0; char op[]={'+','-','*','/','(',')','#'}; InitCalStack(OPTR); InitNumStack(OPND); printf(“请输入算式并在尾部添加一个#号n”); c=getchar(); PushCal(OPTR,'#'); while(c!='#'||GetTopCal(OPTR)!='#') { if (!In(c,op)) { d[0]=d[1]; d[1]=d[2]; d[2]=d[3]; d[3]=d[4]; d[4]=c; c=getchar(); f=1; } else { if(f==1){ PushNum(OPND,ParseInt(d)); d[0]='0';d[1]='0';d[2]='0';d[3]='0';d[4]='0'; f=0; } switch(Preced(GetTopCal(OPTR),c)) { case'<': PushCal(OPTR,c); c=getchar(); break; case'=': PopCal(OPTR); c=getchar(); break; case'>': char theta;int a;int b; theta=PopCal(OPTR); b=PopNum(OPND); a=PopNum(OPND); PushNum(OPND,Operate(a,theta,b)); break; } } } printf(“%dn”,GetTopNum(OPND)); } 程序运行结果: 六,心得体会 通过这次编程,我发现很多编程过程中的不足与问题,很多问题由于考虑不全面,导致程序运行失败。还有一些小问题,比如字母的大小写,括号的遗漏,语法书写错误等等一些基础错误,也是让我体会很深写程序要谨慎仔细。 通过本次课程设计,对图的概念有了一个新的认识,在学习离散数学的时候,总觉得图是很抽象的东西,但是在学习了《数据结构与算法》这门课程之后,我慢慢地体会到了其中的奥妙,图能够在计算机中存在,首先要捕捉他有哪些具体化、数字化的信息,比如说权值、顶点个数等,这也就说明了想要把生活中的信息转化到计算机中必须用数字来完整的构成一个信息库,而图的存在,又涉及到了顶点之间的联系。图分为有向图和无向图,而无向图又是有向图在权值双向相等下的一种特例,如何能在计算机中表示一个双向权值不同的图,这就是一件很巧妙的事情,经过了思考和老师同学的帮助,我用edges[i][j]=up和edges[j][i]=up就能实现了一个双向图信息的存储。对整个程序而言,Dijkstra算法始终都是核心内容,其实这个算法在实际思考中并不难,也许我们谁都知道找一个路径最短的方法,及从顶点一步一步找最近的路线并与其直接距离相比较,但是,在计算机中实现这么一个很简单的想法就需要涉及到很多专业知识,为了完成设计,在前期工作中,基本都是以学习C语言为主,所以浪费了很多时间,比如说在程序中,删除顶点和增加顶点的模块中都有和建图模块相互重复的函数,但是由于技术的原因,只能做一些很累赘的函数,可见在调用知识点,我没有掌握好。不过,有了这次课程设计的经验和教训,我能够很清楚的对自己定一个合适的水平,而且在这次课程设计中我学会了运用两个新的函数sprintf和包涵在#include头文件中的输入函数。因为课程设计的题目是求最短路径,本来是想通过算法的实现把这个程序与交通情况相连,但是因为来不及查找各地的信息,所以,这个计划就没有实现,我相信在以后有更长时间的情况下,我会做出来的。 你也可以在好范文网搜索更多本站小编为你整理的其他数据结构课程设计心得体会精品多篇范文。数据结构课程设计 篇二
数据结构课程设计心得体会 篇三
数据结构课程设计心得体会 篇四
数据结构课程设计心得体会 篇五
数据结构课程设计 篇六
数据结构课程设计心得体会 篇七