数据结构实验 表达式括号匹配配对判断问题分析.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)
<!
不匹配!
潣瑵?
}