数据结构课程设计修改.docx
《数据结构课程设计修改.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计修改.docx(38页珍藏版)》请在冰豆网上搜索。
数据结构课程设计修改
滁州学院
课程设计报告
课程名称:
数据结构课程设计
设计题目:
栈的应用
系别:
计算机信息与工程学院
专业:
计算机科学与技术
组别:
第一组
起止日期:
2012年5月16日~年20126月18日
指导教师:
杨传健
计算机与信息工程学院二○一二年制
课程设计题目
栈的应用
组长
学号
班级
1班
系别
计算机信息与工程学院
专业
计算机科学与技术
组员
指导教师
杨传健
课程设计目的
1、学习栈的一些应用的设计方法。
2、培养勤奋认真、分析故障和解决问题的能力。
课程设计所需环境
Windowxp;multisim10;
课程设计任务要求
利用栈实现数制转换、括号匹配的检验、行编辑器和表达式求值。
课程设计工作进度计划
序号
起止日期
工作内容
分工情况
1
2012.5.16-
2012.5.24
分析题目
各成员进行题目分析并收集相关资料,
查找相关算法
2
2012.5.25-
2012.6.3
程序编写
张路路和袁泉共同负责程序的编写
3
2012.6.3-
2012.6.12
程序初步调试
张路路、袁泉、张震负责对程序的调试,并对错误进行修改,查找资料
4
2012.6.13-
2012.6.14
程序最终调试
全体负责对程序的调试,张路路、袁泉并对错误进行修改,查找资料
5
2012.6.15-
2012.6.16
书写报告
张震、朱银莉、杨功瑾负责书写实验报告
6
2012.6.17-
2012.6.18
实验报告的核实与完善
全体组员最后审核
指导教师签字:
年月日
系(教研室)审核意见:
系(教研室)主任签字:
年月日
课程设计任务书
栈的应用
1引言
1.1栈的说明
栈是一种重要的线性结构。
从数据结构的角度来看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集,是操作受限的线性表,因此,可称为限定性数据结构。
从数据类型角度来看,它是和线性表大不相同的重要抽象数据类型。
由于它广泛应用于各种软件系统,因此在面向对象的程序设计中,它是多型数据类型。
下面对栈做一些说明:
栈是限定仅在表尾进行插入或删除操作的线性表,可对栈进行栈顶进行插入或删除、栈的初始化,判空及取栈顶元素等。
和线性表类似栈也有两种存储表示方法:
顺序栈和链式栈。
栈的应用可如下:
数制转换、括号匹配、行编辑程序、迷宫求解等。
而本次试验便是对前三种应用的一个考察。
1.2课程设计目标
利用栈实现数制转换、括号匹配的检验、行编辑器和表达式求值。
1.3编程工具(编程环境)介绍
编程工具:
MicrosoftVisualC++
编程环境:
MicrosoftWindowsXP
2需求分析
2.1问题的解决步骤
(1)创建两个空栈,一个字符型,一个数型。
(2)写出栈的一些简单操作,如:
取出栈顶元素、将数据元素e入栈、将栈置空、输出栈中元素等。
(3)写出把十进制数N转换为r进制的代码。
(4)写出括号匹配的代码。
(5)写出行编辑的代码。
(6)写出将字符数转换为整数的代码。
(7)写出运算关系的优先级别的判断的代码。
(8)写出进行四则运算的代码。
(9)写出表达式求值的代码。
2.2测试数据
请输入选择:
1;数字转换2;括号匹配的检测3;行编辑程序4;表达式求值0:
退出程序
1
请输入要转换的数及转换的进制
102
转换后的数为1010
请继续选择2
请输入
{()}
括号匹配
请继续选择3
Happ#py
输出Happy
请继续选择4
请输入表达式1+1=
2
请继续选择0
退出程序
3流程图
4数据结构设计
4.1结构体的定义
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;//栈的可用最大容量
}SqStack1;
4.2具体函数功能解说
InitStack1(SqStack1*S)创建一个空栈S
StackEmpty1(SqStack1*S)判断栈是否为空,为空则返回1,否则返回0
GetTop1(SqStack1S,SElemType*e)取出栈顶元素
Push1(SqStack1*S,SElemTypee)将数据元素e入栈
Pop1(SqStack1*S,SElemType*e)如栈不为空,将栈顶元素出栈
clearStack(SqStack1*S)将栈置空
Print_SqStackTraverse1(SqStack1S)输出栈中元素
DestroyStack(SqStack1*S)销毁栈
conversion(intN,intr)把十进制数N转换为r进制
prool()括号匹配
LineEdit()行编辑
Transformnum(charc,float*sum,intj)将字符数转换为整数
Precede(SElemTypea,SElemTypec)运算关系的优先级别的判断
Operate(floata,SElemTypetheta,floatb)进行四则运算
EvaluateExpression()表达式求值
5详细设计
5.1把十进制数N转换为r进制
5.1.1主要代码
voidconversion(intN,intr)
{
floatx;
SqStack2S;
InitStack2(&S);
while(N!
=0)
{
x=N%r;
Push2(&S,x);
N=N/r;
}
Print_SqStackTraverse2(S);
}
5.1.2界面设计及测试结果
图5-1数制装换界面
5.2括号匹配
5.2.1主要代码
intprool()//括号匹配
{
SqStack1S;
InitStack1(&S);
chara[10];
printf("请输入\n");
fflush(stdin);
gets(a);
inti,flag;
chare;
i=0;flag=1;
while(a[i]!
='\0'&&flag==1)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
Push1(&S,a[i]);
else{
switch(a[i]){
case')':
Pop1(&S,&e);
if(e!
='(')
flag=0;
break;
case']':
Pop1(&S,&e);
if(e!
='[')
flag=0;
break;
case'}':
Pop1(&S,&e);
if(e!
='{')
flag=0;
break;
}
}
i++;
}
if(flag==0)
printf("括号不匹配\n");
else
printf("括号匹配\n");
returnOK;
}
voidLineEdit()//行编辑
{
SqStack1S;
charch,c,a[50];
inti=0;
InitStack1(&S);//构造空栈,用来当缓冲区
fflush(stdin);
ch=getchar();
while(ch!
='.')
{while(ch!
='.'&&ch!
='\n')
{switch(ch)
{case'#':
Pop1(&S,&c);break;/*当栈非空时退栈*/
case'@':
clearStack(&S);break;
default:
Push1(&S,ch);break;/*有效字进栈*/
}
ch=getchar();/*接收下一个字符*/
}
while(S.base!
=S.top)
{
Pop1(&S,&a[i]);
i++;/*把栈逆序输出到a*/
}
clearStack(&S);/*把栈重置为空,以便再当缓冲区*/
if(ch!
='.')
{
a[i]='\0';
ch=getchar();
i=i+1;
}
}
for(i=i-1;i>=0;i--)
{
if(a[i]!
='\0')
printf("%c",a[i]);
elseprintf("\n");
}
printf("\n");
//DestroyStack(&S);
}
floatTransformnum(charc,float*sum,intj)//将字符数转换为整数
{
inti=1,x;
if(j==1)//小数点以前数的转换
{
x=c-'0';
*sum=(*sum)*10+x;
}
if(j==0)//点以后的转换
{x=c-'0';
*sum=(*sum)+x/pow(10,i);
i++;
}
returnOK;
}
5.2.2界面设计及测试结果
图5-2括号匹配界面
5.3行编辑
5.3.1主要代码
voidLineEdit()//行编辑
{
SqStack1S;
charch,c,a[50];
inti=0;
InitStack1(&S);//构造空栈,用来当缓冲区
fflush(stdin);
ch=getchar();
while(ch!
='.')
{while(ch!
='.'&&ch!
='\n')
{switch(ch)
{case'#':
Pop1(&S,&c);break;/*当栈非空时退栈*/
case'@':
clearStack(&S);break;
default:
Push1(&S,ch);break;/*有效字进栈*/
}
ch=getchar();/*接收下一个字符*/
}
while(S.base!
=S.top)
{
Pop1(&S,&a[i]);
i++;/*把栈逆序输出到a*/
}
clearStack(&S);/*把栈重置为空,以便再当缓冲区*/
if(ch!
='.')
{
a[i]='\0';
ch=getchar();
i=i+1;
}
}
for(i=i-1;i>=0;i--)
{
if(a[i]!
='\0')
printf("%c",a[i]);
elseprintf("\n");
}
printf("\n");
//DestroyStack(&S);
}
5.3.2界面设计及测试结果
图5-3行编辑界面
5.4表达式求值
5.4.1主要代码
voidEvaluateExpression()//表达式求值
{
charc[20],e,theta;
floata,b,sum=0;
inti=0,j=1,h=0,x;
//创建两个栈,一个储存运算符,一个储存运算数
SqStack1S1;//运算符栈
InitStack1(&S1);
SqStack2S2;//运算数栈
InitStack2(&S2);
Push1(&S1,'=');
Push2(&S2,0);
printf("请输入表达式");
scanf("%s",c);
/*for(i=0;c[i]!
='\0';i++)
{
if(c[i]>='0'&&c[i]<='9'||c[i]=='+'||c[i]=='-'||c[i]=='*'||c[i]=='/'||c[i]=='('||c[i]==')'||c[i]=='='||c[i]=='.')
{
h=1;
}
if(h=0)
{
printf("输入有误,请重新输入\n");
scanf("%s",c);
i=0;
}
}*/
GetTop1(S1,&e);
while(c[i]!
='='||e!
='=')
{
if(c[i]!
='+'&&c[i]!
='-'&&c[i]!
='*'&&c[i]!
='/'&&c[i]!
='('&&c[i]!
=')'&&c[i]!
='=')
{
if(c[i]=='.')
{
j=0;
i++;
}
Transformnum(c[i],&sum,j);//字符数转换为整数
if(c[i+1]=='+'||c[i+1]=='-'||c[i+1]=='*'||c[i+1]=='/'||c[i+1]=='('||c[i+1]==')'||c[i+1]=='=')
Push2(&S2,sum);
}
else{
if(e=='('&&c[i]=='-')
{
Push2(&S2,'\0');
}
switch(Precede(e,c[i])){
case-1:
Push1(&S1,c[i]);
break;
case0:
Pop1(&S1,&e);
break;
case1:
Pop1(&S1,&theta);
Pop2(&S2,&b);
Pop2(&S2,&a);
Push2(&S2,Operate(a,theta,b));
i=i-1;
break;
}
sum=0;
j=1;
}
i++;
GetTop1(S1,&e);
}
GetTop2(S2,&sum);
printf("%f\n",sum);
}
5.4.2界面设计及测试结果
图5-4表达式求值界面
5.5主程序
5.5.1主要代码
voidmain()
{
intchoice;
printf("1:
数制转换2:
括号匹配的检验\n");
printf("\n");
printf("3:
行编辑程序4:
表达式求值\n");
printf("");
printf("0:
退出程序\n");
printf("请选择\n");
scanf("%d",&choice);
while(choice!
=0)
{
switch(choice){
case1:
intN;
intr;//进制转换
printf("请输入要转换的数及转换的进制\n");
scanf("%d%d",&N,&r);
printf("转换后的数为:
");
conversion(N,r);
printf("\n");
break;
case2:
prool();//括号匹配
break;
case3:
LineEdit();//行编辑
break;
case4:
EvaluateExpression();//表达式求值
break;
default:
printf("输入有误\n");
break;
}
printf("请继续选择");
scanf("%d",&choice);
}
}
5.5.2界面设计及测试结果
图5-5主程序界面
5.6界面设计及测试结果
图5-6程序运行图
6算法分析
6.1把十进制数N转换为r进制
voidconversion(intN,intr)
{
while(N!
=0)
{
x=N%r;
Push2(&S,x);
N=N/r;
}
}
6.2表达式求值
voidEvaluateExpression()//表达式求值
{
SqStack1S1;//运算符栈
InitStack1(&S1);
SqStack2S2;//运算数栈
InitStack2(&S2);
Push1(&S1,'=');
Push2(&S2,0);
printf("请输入表达式");
scanf("%s",c);
GetTop1(S1,&e);
while(c[i]!
='='||e!
='=')
{
if(c[i]!
='+'&&c[i]!
='-'&&c[i]!
='*'&&c[i]!
='/'&&c[i]!
='('&&c[i]!
=')'&&c[i]!
='=')
{
if(c[i]=='.')
{
j=0;
i++;
}
Transformnum(c[i],&sum,j);//字符数转换为整数if(c[i+1]=='+'||c[i+1]=='-'||c[i+1]=='*'||c[i+1]=='/'||c[i+1]=='('||c[i+1]==')'||c[i+1]=='=')
Push2(&S2,sum);
}
else{
if(e=='('&&c[i]=='-')
{
Push2(&S2,'\0');
}
switch(Precede(e,c[i])){
case-1:
Push1(&S1,c[i]);
break;
case0:
Pop1(&S1,&e);
break;
case1:
Pop1(&S1,&theta);
Pop2(&S2,&b);
Pop2(&S2,&a);
Push2(&S2,Operate(a,theta,b));
i=i-1;
break;
}
sum=0;
j=1;
}
i++;
GetTop1(S1,&e);
}
GetTop2(S2,&sum);
printf("%f\n",sum);
}
6.3行编辑
voidLineEdit()//行编辑
{
SqStack1S;
InitStack1(&S);//构造空栈,用来当缓冲区
fflush(stdin);
ch=getchar();
while(ch!
='.')
{while(ch!
='.'&&ch!
='\n')
{switch(ch)
{case'#':
Pop1(&S,&c);break;/*当栈非空时退栈*/
case'@':
clearStack(&S);break;
default:
Push1(&S,ch);break;/*有效字进栈*/
}
ch=getchar();/*接收下一个字符*/
}
while(S.base!
=S.top)
{
Pop1(&S,&a[i]);
i++;/*把栈逆序输出到a*/
}
clearStack(&S);/*把栈重置为空,以便再当缓冲区*/
if(ch!
='.')
{
a[i]='\0';
ch=getchar();
i=i+1;
}
}
for(i=i-1;i>=0;i--)
{
if(a[i]!
='\0')
printf("%c",a[i]);
elseprintf("\n");
}
printf("\n");
DestroyStack1(&S);
}
6.4括号匹配
intprool()//括号匹配
{
SqStack1S;
InitStack1(&S);
fflush(stdin);
for(i=0;a[i]!
='\0';i++);
length=i;
chare;
i=0;flag=1;
while(i<=length&&flag==1)
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
Push1(&S,a[i]);
else{
//Push1(&S,NULL);
switch(a[i]){
case')':
Pop1(&S,&e);
if(e!
='(')
flag=0;
break;
case']':
Pop1(&S,&e);
if(e!
='[')
flag=0;
break;
case'}':
Pop1(&S,&e);
if(e!
='{')
flag=0;
break;
case'\0':
Pop1(&S,&e);
if(e!
='\0')
flag=0;
//default:
flag=0;
//break;
}
}
i++;
}
DestroyStack1(&S);
}
7课程设计总结与体会
两周的课程设计结束了,在这次的课程设计中不仅检验了我们所学习的知识,也培养了我们如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.
通过这次栈的应用课程设计,综合运用本专业所学课程的理论和生产实际知识进行一次栈应用设计工作的实际训练从而培养和提高学生独立工作能力,巩固与扩充了数据结构等课程所学的内容,掌握设计的方法和步骤,掌握程序设计的基本的技能懂得了怎样分析,怎样确定方案,提高了计算能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。
在这次设计过程中,体现出我们课程设计的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
8致谢
在此感谢我们的杨传健老师.,老师严谨细致、一丝不苟的作风一直是我们工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我们无尽的启迪;这次课程设计的每个实验细节,都离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我们能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我们的帮助和支持,让我们感受到同学的友谊。
9参考文献
严蔚敏,吴伟民,米宁编著.数据结构习题集(C语言版)[M],北京:
清华大学出版社2011.48-54.