括号匹配的检验.docx
《括号匹配的检验.docx》由会员分享,可在线阅读,更多相关《括号匹配的检验.docx(12页珍藏版)》请在冰豆网上搜索。
括号匹配的检验
湖南工学院
计算机与信息科学系
课程设计报告
2010—2010学年第一学期
课程名称——数据结构
设计题目——括号匹配的检验
姓名——
专业班级—2
学号——
2010年12月31日
目录
1设计任务书………………………………
1.1题目与要求………………………………………………
1.2设计中涉及的知识点……………………………………
2功能设计…………………………………
2.1抽象数据类型的定义………………………………………
2.2模块流程图………………………………………………
3程序代码设计与说明……………………
3.1子程序设计与其功能……………………………………
3.2主函数设计与其功能……………………………………
4程序设计总结……………………………
4.1程序调试情况……………………………………………
4.2个人经验及体会…………………………………………
5用户使用说明……………………………
6测试结果…………………………………
7附录(源程序)…………………………
1设计任务书
1.1题目与要求
[问题描述]
假设表达式中允许有两种括号:
圆括号和方括号,其嵌套的顺序随意,即(()[])或
[([][])]等为正确格式,[(])或(((]均为不正确的格式。
检验括号是否匹配的方法可用
“期待的紧迫程度”这个概念来描述。
例如:
考虑下列的括号序列:
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8
当计算机接受了第1个括号以后,他期待着与其匹配的第8个括号的出现,然而等来的却是第2个
括号,此时第1个括号“[”只能暂时靠边,而迫切等待与第2个括号相匹配的第7个括号“)”的出现,类似的,因只等来了第3个括号“[”,此时,其期待的紧迫程度较第2个括号更紧迫,则第2个括号只能靠边,让位于第3个括号,显然第3个括号的期待紧迫程度高于第2个括号,而第2个括号的期待紧迫程度高于第1个括号;在接受了第4个括号之后,第3个括号的期待得到了满足,消解之后,第2个括号的期待匹配就成了最急迫的任务了,……,依次类推。
可见这个处理过程正好和栈的特点相吻合。
[基本要求]
读入圆括号和方括号的任意序列,输出“匹配”或“此串括号匹配不合法”。
1.2设计中涉及的知识点
编译预处理(文件包含)、选择结构、循环结构、堆栈、函数
2功能设计
2.1抽象数据类型的定义
包括堆栈的定义
2.2模块流程图
3程序代码设计
3.1子程序设计及其功能
(1)函数原型:
Stackinitiate(Seqstack*S)
功能:
初始化堆栈
代码:
voidStackinitiate(Seqstack*S)
{
S->top=0;
}
(2)函数原型:
Stacknotempty(SeqstackS)
功能:
判断堆栈是否为空
代码:
intStacknotempty(SeqstackS)
{
if(S.top<=0)return0;
elsereturn1;
}
(3)函数原型:
Stackpush(Seqstack*S,Datatypex)
功能:
数据元素入栈
代码:
intStackpush(seqstack*S,Datatypex)
{
if(S->top>=Maxstack)
{
printf("堆栈已满无法插入!
\n");
return0;
}
else
{
S->stack[S->top]=x;
S->top++;
return1;
}
}
(4)函数原型:
Stackpop(Seqstack*S,Datatype*d)
功能:
堆栈中数据元素出栈
代码:
intStackpop(Seqstack*S,Datatype*d)
{
if(S->top<=0)
{
printf("堆栈已空无数据元素出栈!
\n");
return0;
}
else
{
S->top--;
*d=S->stack[S->top];
return1;
}
}
(5)函数原型:
Stacktop(SeqstackS,Datatype*d)
功能:
取堆栈中栈顶元素
代码:
intStacktop(SeqstackS,Datatype*d)
{
if(S.top<=0)
{
printf("堆栈已空!
\n");
return0;
}
else
{
*d=S.stack[S.top-1];
return1;
}
}
3.2主函数设计及其功能
代码:
voidmain()
{
charstr[Maxstack];
printf("请输入要匹配的括号的序列:
\n");
gets(str);
voidExpiscorrect(str);
}
功能:
输入一组括号的序列,可检验括号是否匹配正确。
4程序设计总结
4.1程序调试情况
出现了很多的小错误,咧如:
missing';'、syntaxerror:
')'在调用函数的时候用了黏贴和复杂加了一下无效的字符,定义符号也加了进去,还有大小写的一些错误。
4.2个人经验及体会
经过一个星期的上机实践学习,使我对c语言和数据结构有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对c语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对c语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习c语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
5用户使用说明
步骤:
输入你想匹配的括号的序列,再按回车键。
会出现‘匹配!
’和‘此串括号匹配不合法!
’两种结果。
6测试结果
7附录(源程序)
#include"string.h"
#include"stdio.h"
#defineMaxstack100
typedefcharDataType;
//#include"SeqStack.h"
typedefstruct
{
DataTypestack[Maxstack];
inttop;
}Seqstack;/*定义结构体*/
voidStackinitiate(Seqstack*S)/*初始化*/
{
S->top=0;
}
intStacknotempty(SeqstackS)/*判断非空否*/
{
if(S.top<=0)return0;
elsereturn1;
}
intStackpush(Seqstack*S,DataTypex)/*入栈*/
{
if(S->top>=Maxstack)
{
printf("堆栈已满无法插入!
\n");
return0;
}
else
{
S->stack[S->top]=x;
S->top++;
return1;
}
}
intStackpop(Seqstack*S,DataType*d)/*出栈*/
{
if(S->top<=0)
{
printf("堆栈已空无数据元素出栈!
\n");
return0;
}
else
{
S->top--;
*d=S->stack[S->top];
return1;
}
}
intStacktop(SeqstackS,DataType*d)
{
if(S.top<=0)
{
printf("堆栈已空!
\n");
return0;
}
else
{
*d=S.stack[S.top-1];
return1;
}
}
voidExpiscorrect(charexp[Maxstack])/*判断有n个字符的的字符串exp左、右括号是否配对正确*/
{
Seqstackmystack;
inti;
charc;
Stackinitiate(&mystack);
for(i=0;exp[i]!
='\0';i++)
{
if((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]==')')||(exp[i]==']')&&!
Stacknotempty(mystack))
{
printf("此串括号匹配不合法!
\n");
return;
}
}
if(Stacknotempty(mystack))
printf("此串括号匹配不合法!
\n");
else
printf("匹配!
\n");
}
voidmain()
{
charstr[Maxstack];
printf("请输入要匹配的括号的序列:
\n");
gets(str);
Expiscorrect(str);
}