题目描述
本题实现求表达式中括号是否匹配。只需判断表达式中括号(本题中只会出现三种括号,分别是小括号,中括号和大括号)是否匹配,表达式中可以有其他值也可没有。
函数接口定义:
int match (char *exp);
其中 exp 为需判断括号是否正确的表达式,返回值为1或0,如果为1,则表示括号匹配,0表示不匹配。
裁判测试程序样例:
#include <stdio.h>
#define N 20
int match (char *exp);
int main()
{
char s[N];
int flag;
scanf("%s",s);
flag=match(s);
if(flag)
printf("%s match",s);
else
printf("%s not match",s);
return 0;
}
/* 请在这里填写答案 */
输入样例1:
{[2*(3+2)-7]}/4
输出样例1:
{[2*(3+2)-7]}/4 match
输入样例2:
{[()]}
输出样例2:
{[()]} match
解题思路
对栈有一定的了解思考一下就可以做出来了,相关的思路已经在代码注释里给出,有不会的评论区提问即可
有一些写法比较简洁,如果不习惯也可以用if判断再return
C语言解法
int match (char *exp)
{
typedef struct{
char data[N]; //在C语言中用char数组模拟string
int top; //栈顶指针
}myStack;
myStack S; //开辟结构体
S.top=-1; //初始化栈顶指针
while(*exp) //当exp指针指导最后一个即\0时等效于NULL
{
if(*exp=='{'||*exp =='(' || *exp=='[') //如果是左括号 压栈
{
if(S.top<N-1) //判断栈是否已满
{
S.data[++S.top]=*exp; //未满则存入数组并且移动栈顶指针
}
else // 如果左括号都会满的话 没有空间给右括号了 直接返回0代表表达式错误
{
return 0;
}
}
else if(*exp=='}' || *exp==')' || *exp==']') //如果是右括号
{
if(S.top==-1) //如果此时栈空 代表表达式错误(先要有左括号才能有右括号)
{
return 0;
}
else //栈不为空
{
char left=S.data[S.top--]; //取栈顶元素并且移动栈顶指针
if((left=='{' && *exp!='}') || (left=='(' && *exp !=')') ||
(left=='[' && *exp!=']')) //如果左右括号不匹配 直接错误
{
return 0;
}
}
}
exp++; //移动exp指针
}
return S.top==-1; //如果正常的话,匹配完栈又是返回初始状态的
}