数据结构课程设计括号匹配问题.docx

上传人:b****5 文档编号:3534766 上传时间:2022-11-23 格式:DOCX 页数:12 大小:19.39KB
下载 相关 举报
数据结构课程设计括号匹配问题.docx_第1页
第1页 / 共12页
数据结构课程设计括号匹配问题.docx_第2页
第2页 / 共12页
数据结构课程设计括号匹配问题.docx_第3页
第3页 / 共12页
数据结构课程设计括号匹配问题.docx_第4页
第4页 / 共12页
数据结构课程设计括号匹配问题.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构课程设计括号匹配问题.docx

《数据结构课程设计括号匹配问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计括号匹配问题.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构课程设计括号匹配问题.docx

数据结构课程设计括号匹配问题

课程设计

 

课程名称数据结构

题目名称括号匹配

 

2010年12月27日

 

课程设计(论文)任务书

题目名称

括号匹配

学生学部(系)

信息与计算机学部

专业班级

09计算机2班

姓名

XX

学号

110109020XX

一、课程设计(论文)的内容

括号匹配问题,假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个函数,用来判别表达式中括号是否正确配对。

二、课程设计(论文)的要求与数据

要求当输入一表达式,可判断并输出括号是否匹配。

三、课程设计(论文)应完成的工作

(1)根据上述要求完成一个功能完善的程序;

(2)采用模块化的程序设计方法,程序书写符合规范,程序设计应完善;

(3)对系统进行初步的错误和漏洞检测;

(4)根据设计规范撰写报告并按时提交;

(5)设计内容用A4纸打印并按要求装订。

 

四、课程设计(论文)进程安排

序号

设计(论文)各阶段内容

地点

起止日期

1

搜集资料

图书馆

11.24-11.26

2

需求分析

图书馆

11.27-11.30

3

系统分析与设计

图书馆

12.1-12.4

4

功能模块的实现

综702机房

12.5-12.15

5

系统测试,运行

综702机房

12.16-12.19

6

完成课程设计(论文)

综702机房

12.20-12.27

五、应收集的资料及主要参考文献

【1】周海英.马巧梅.数据结构与算法设计(第二版).国际工业出版社2005

【2】朱战立.数据结构---使用C语言(第四版).电子工业出版社2009

【3】吴跃.数据结构和算法.机械工业出版社2010

 

发出任务书日期:

2010年11月23日指导教师签名:

计划完成日期:

2010年12月27日教学单位责任人签章:

1设计内容1

2算法思想描述1

3算法及程序实现2

4算法测试及结果4

5总结8

参考资料9

设计内容:

括号匹配问题,假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个函数,用来判别表达式中括号是否正确配对。

算法要求:

要求当输入一表达式,可判断并输出括号是否匹配。

算法思想

在算术表达式中,右括号和左括号匹配的次序正好符合后到的括号要最先被匹配的“后进先出”堆栈操作特点,因此可以借助一个堆栈来进行判断。

括号匹配共有以下4种情况:

1左右括号配对次序不正确;

2右括号多于左括号;

3左括号多于右括号;

4左右括号配对正确;

 

具体方法如下:

顺序扫描算术表达式,当遇到3种类型括号的左括号时,让该括号进栈。

当扫描到某一种类型的右括号时,比较当前栈顶括号是否与之匹配,若匹配,则退栈继续进行判断;若当前栈顶括号与当前扫描的括号不相同,则左、右括号配对次序不正确;若字符串当前为某种类型右括号而堆栈已空,则右括号多于左括号;字符串循环扫描结束时,若堆栈非空,则说明左括号多于右括号;如果上述三种情况都没有出现,则说明左、右括号匹配正确。

 

算法以及程序实现

主函数设计如下:

VoidExpIsCorrect(charexp[],intn)//判断有n个字符的字符串exp左、右括号是否配对正确

 

{

SeqStackmyStack;//定义顺序堆栈变量myStack

inti;

charc;

StackInitiate(&myStack);//初始化堆栈

for(i=0;i

{

if((exp[i]=='(')||(exp[i]=='[']||(exp[i]=='{'))

StackPush(&myStack,exp[i]);//入栈

elseif(exp[i]==')'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c=='(')

StackPop(&myStack,&c);//出栈

elseif(exp[i]==')'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c!

='(')

{

printf("左右括号配对次序不正确!

\n");

return;

}//判断括号

 

elseif(exp[i]==']'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c=='[')

StackPop(&myStack,&c);

elseif(exp[i]==']'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c!

='[')

printf("左右括号配对次序不正确!

\n");

return;

}//判断方括号

 

elseif(exp[i]=='}'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c=='{')

StackPop(&myStack,&c);

elseif(exp[i]==']'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c!

='{')

{

printf("左右括号配对次序不正确!

\n");

return;

}//判断花括号

 

elseif(((exp[i]==')')||(exp[i]==')')||(exp[i]=='}'))

&&!

StackNotEmpty(myStack))

{

printf("右括号多于左括号!

\n");

return;

}

}

if(StackNotEmpty(myStack))

printf("左括号多于右括号!

\n");

else

printf("左右括号匹配正确!

\n");

}

 

3

算法测试以及测试结果

函数头文件(SeqStack.h):

typedefstruct

{

DataTypestack[MaxStackSize];

inttop;

}SeqStack;

voidStackInitiate(SeqStack*S)/*初始化顺序堆栈S*/

{

S->top=0;/*定义初始栈顶下标值*/

}

intStackNotEmpty(SeqStackS)

/*判顺序堆栈S非空否,非空则返回1,否则返回0*/

{

if(S.top<=0)return0;

elsereturn1;

}

intStackPush(SeqStack*S,DataTypex)

/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0*/

{

if(S->top>=MaxStackSize)

{

printf("堆栈已满无法插入!

\n");

return0;

}

else

{

S->stack[S->top]=x;

S->top++;

return1;

}

}

intStackPop(SeqStack*S,DataType*d)

/*弹出顺序堆栈S的栈顶数据元素值到参数d,出栈成功则返回1,否则返回0*/

{

if(S->top<=0)

{

printf("堆栈已空无数据元素出栈!

\n");

return0;

}

else

{

S->top--;

*d=S->stack[S->top];

return1;

}

}

intStackTop(SeqStackS,DataType*d)

/*取顺序堆栈S的当前栈顶数据元素值到参数d,成功则返回1,否则返回0*/

{

if(S.top<=0)

{

printf("堆栈已空!

\n");

return0;

}

else

{

*d=S.stack[S.top-1];

return1;

}

}

测试函数如下:

#include

#include

#defineMaxStackSize100

typedefcharDataType;

#include"SeqStack.h"

VoidExpIsCorrect(charexp[],intn)//判断有n个字符的字符串exp左、右括号是否配对正确

 

{

SeqStackmyStack;//定义顺序堆栈变量myStack

inti;

charc;

StackInitiate(&myStack);//初始化堆栈

for(i=0;i

{

if((exp[i]=='(')||(exp[i]=='[']||(exp[i]=='{'))

StackPush(&myStack,exp[i]);//入栈

elseif(exp[i]==')'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c=='(')

StackPop(&myStack,&c);//出栈

elseif(exp[i]==')'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c!

='(')

{

printf("左右括号配对次序不正确!

\n");

return;

}//判断括号

 

elseif(exp[i]==']'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c=='[')

StackPop(&myStack,&c);

elseif(exp[i]==']'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c!

='[')

{

printf("左右括号配对次序不正确!

\n");

return;

}//判断方括号

 

elseif(exp[i]=='}'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c=='{')

StackPop(&myStack,&c);

elseif(exp[i]==']'&&StackNotEmpty(myStack)

&&StackTop(myStack,&c)&&c!

='{')

{

printf("左右括号配对次序不正确!

\n");

return;

}//判断花括号

 

elseif(((exp[i]==')')||(exp[i]==')')||(exp[i]=='}'))

&&!

StackNotEmpty(myStack))

{

printf("右括号多于左括号!

\n");

return;

}

}

if(StackNotEmpty(myStack))

printf("左括号多于右括号!

\n");

else

printf("左右括号匹配正确!

\n");

}

voidmain(void)

{

chara[]="(())abc{[]()}";//测试例子1

charb[]="(()))abc{[]}";//测试例子2

charc[]="(()()abc{[]}";//测试例子3

chard[]="(())abc{[]}";//测试例子4

intn1=strlen(a);

intn2=strlen(b);

intn3=strlen(c);

intn4=strlen(d);

 

ExpIsCorrect(a,n1);

ExpIsCorrect(b,n2);

ExpIsCorrect(c,n3);

ExpIsCorrect(d,n4);

}

 

测试结果:

左括号配对次序不正确!

右括号多于左括号!

左括号多于右括号!

左右括号匹配正确!

7

总结

课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。

通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说指针和堆栈的使用。

通过这次课程设计之后,我又把前面所学过的知识又重新温故了一遍。

我做的课题是:

编一个程序判断括号是否匹配。

我发现编程是一件很枯燥很无聊的事情,但是我强破自己坚持下去,按照老师所说的模块化思想,分部分的进行编写。

而且编程是一件高精度、模范化的事情,稍有疏乎都会影响全局,也可能因为某一处的小的错误而导致整个程序的无法运行。

所以认真仔细就是非常重要的了。

开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。

很庆幸最终我完成了这个作业

通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,比如说经常漏写分号和把中文的标点符号写进去程序里面,但是我会在接下来的学习中改掉这些毛病也会更加注视实践操作,使自己能够把这门课程学好。

 

8

参考文献

【4】周海英.马巧梅.数据结构与算法设计(第二版).国际工业出版社2005

【5】朱战立.数据结构---使用C语言(第四版).电子工业出版社2009

【6】吴跃.数据结构和算法.机械工业出版社2010

 

9

课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说是无处不在。

回顾起此次课程设计,至今我仍感慨颇多,从拿到题目到完成整个编程,从理论到实践,在这将近半个月的日子里,我学到了很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,可以说得是困难重重,而且我还发现自己对堆栈以及指针了解的不够透彻。

不过做课程设计难免会遇到过各种各样的问题,但是很庆幸,我并没有放弃,我还是坚持完成了这次课程设计。

 总的来说,这次课程设计确实学到很多,不仅锻炼了我遇到问题解决问题的勇气和能力,还练就了遇到挫折不达目的不罢休的韧性,这在以后的工作与学习中将会非常重要。

2010年12月27日

 

年月日

 

年月日

10

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1