数据结构实验 表达式括号匹配配对判断问题分析.docx
- 文档编号:10822428
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:11
- 大小:45.66KB
数据结构实验 表达式括号匹配配对判断问题分析.docx
《数据结构实验 表达式括号匹配配对判断问题分析.docx》由会员分享,可在线阅读,更多相关《数据结构实验 表达式括号匹配配对判断问题分析.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构实验表达式括号匹配配对判断问题分析
实验表达式括号匹配配对判断问题
姓名:
班级:
实验时间:
学号:
1.问题描述
一个算术表达式含圆括号、中括号、花括号,且它们可任意嵌套使用。
写一程序,判断任一算术表达式中所含括号是否正确配对。
2.数据结构设计
匹配判别发生在右括号出现时,且被匹配的左括号应是距离右括号最近被输入的,二不是最先被输入的括号
,即“先入后匹配”。
因此用栈来解决。
#definestacksize100//定义栈的空间大小
struct
stack{//定义栈的结构体
charstrstack[stacksize];//定义栈的存储格式为字符型
inttop;//定义栈的栈顶变量
};
voidInitStack(stack&s)
{//定义一个新栈s,初始化栈顶为-1
s.top=-1;
}
3.算法设计
(1)入栈的算法
charPush(stack&s,chara)
{//入栈操作,将字符a入栈s
if(s.top==stacksize-1)//当栈顶为栈的空间大小-1,栈满
return0;
s.top++;//入栈操作一次,栈顶+1
s.strstack[s.top]=a;//此时,栈顶元素为字符a
returna;
}
(2)出栈的算法设计
charPop(stack&s)
{//出栈操作
if(s.top==-1)//当栈顶为-1时,栈空
return0;
chara=s.strstack[s.top];//将栈顶元素赋予字符a,并返回字符a,完成出栈操作
s.top--;
returna;
}
(3)判断栈是否为空的函数
intEmpty(stack&s,intre)
{//定义判断栈是否为空的函数
if(s.top==-1)
return1;//栈为空时返回值为1
else
return0;//栈不为空时返回值为0
}
(4)判断是否匹配的算法。
如果右括号,进栈,取下个字符;如果是左括号,出栈,取下个字符;最后判断栈是否为空。
intCheck(char*str)
{//检验括号是否匹配的函数
stacks;
InitStack(s);
intstrn=strlen(str);//定义字符串长度为strn
for(inti=0;i { chara=str[i]; intre=0; switch(a) {//对输入的字符a进行判断 case'(': case'{': case'[': Push(s,a);//若是左括号,则进行入栈操作 break; //若是右括号,则进行出栈操作,若出栈元素不是与输入相对应的左括号,则字符串括号中不匹配,返回 case')': if(Pop(s)! ='(') return0; break; case'}': if(Pop(s)! ='{') return0; break; case']': if(Pop(s)! ='[') return0; break; } } intre=0;//定义并初始化判空函数的返回值 re=Empty(s,re);//返回判空函数的返回值 if(re==1) return1;//栈为空 else return0;//栈不为空,有左括号,存在'('或'['或'{'未匹配 } 4.运行与测试 1+(2+3) 输入①. ②输入1+(2+3)) ③输入1+((2+3) ④输入1+2+3+4 ⑤输入1+[2+(4-2])*2 5.调试记录及收获 在运行程序时,当输入1+((2+3)时,因为错把'('写成'(',也就是输入法的中英文没有切换,所以得到的结果是错的。 这就说明输入时要注意中英文。 通过本次实验,我对栈的使用更加熟练,入栈出栈的顺序也有了更一步的了解。 附: 源代码 #includestdafx.h #include #include #include usingnamespacestd; #definestacksize100//定义栈的空间大小 struct stack{//定义栈的结构体 charstrstack[stacksize];//定义栈的存储格式为字符型 inttop;//定义栈的栈顶变量 }; voidInitStack(stack&s) {//定义一个新栈s,初始化栈顶为-1 s.top=-1; } charPush(stack&s,chara) sa入栈{//入栈操作,将字符-1,栈满if(s.top==stacksize-1)//当栈顶为栈的空间大小return0; +1 入栈操作一次,栈顶s.top++;//a此时,栈顶元素为字符s.strstack[s.top]=a;// returna; } charPop(stack&s) {//出栈操作if(s.top==-1)//-1时,栈空当栈顶为return0; ,完成a将栈顶元素赋予字符chara=s.strstack[s.top];//,并返回字符a出栈操作s.top--; returna; } intEmpty(stack&s,intre) {//定义判断栈是否为空的函数if(s.top==-1) 1栈为空时返回值为return1;// else return0;//栈不为空时返回值为0 } intCheck(char*str) {//检验括号是否匹配的函数 stacks; InitStack(s); intstrn=strlen(str);//定义字符串长度为strn for(inti=0;i { chara=str[i]; intre=0; switch(a) {//对输入的字符a进行判断 case'(': case'{': case'[': Push(s,a);//若是左括号,则进行入栈操作 break; //若是右括号,则进行出栈操作,若出栈元素不是与输入相对应的左括号,则字符串括号中不匹配,返回 case')': if(Pop(s)! ='(') return0; break; case'}': if(Pop(s)! ='{') return0; break; case']': if(Pop(s)! ='[') return0; break; /*case')': if(Empty(s,re)||Pop(s)! ='(')return0; Pop(s);break; case']': if(Empty(s,re)||Pop(s)! ='[')return0; Pop(s);break; case'}': if(Empty(s,re)||Pop(s)! ='{')return0; Pop(s);break;*/ } } 定义并初始化判空函数的返回值intre=0;//返回判空函数的返回值re=Empty(s,re);// if(re==1) return1;//栈为空 else 未匹配'{'或'['或'('栈不为空,有左括号,即存在return0;// } 主函数voidmain()//{ charstr[100];//定义一个单字符型数组以储存键盘输入的字符串。 < 100的字符串: 请输入一个长度小于潣瑵? cin>>str;//从键盘输入字符存储到字符数组中,有输入则继续。 intre=Check(str); if(re==1) < 潣瑵? else if(re==0) < ! 不匹配! 潣瑵? }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验 表达式括号匹配配对判断问题分析 数据结构 实验 表达式 括号 匹配 配对 判断 问题 分析