思路:
括号匹配需要一一对应且从左向右遇到的第一个右括号需要与该右括号左边的第一个左括号类型匹配,即左小括号与右小括号,左中括号与右中括号,左大括号与右大括号匹配。
不满足的情况有三种类型:
1 | ( ( ) | 左右括号个数不同 |
---|---|---|
2 | ( { ) } | 非法匹配1 |
3 | )()( | 非法匹配2 |
1.模拟括号匹配的过程,可以建立一个栈,遇到左括号进栈,遇到右括号则先判断栈是否为空,若栈为空输出no (对应表格中第三种情况),若栈不为空,将栈顶元素与该右括号进行匹配。如果匹配成功栈顶元素出栈,否则输出no(对应表格中的第二种情况)。
2.将括号串读完以后,若栈不为空则输出no,若栈为空则输出yes。(对应表格中第一种情况)
完整代码展示:
#include <iostream>
#include<string.h>
using namespace std;
#define max 100
typedef struct
{
char num[max];
int top;
}stack;
//初始化
void initstack(stack *a)
{
a->top=-1;
}
//判断是否为空
int isempty(stack *a)
{
if(a->top==-1)
return true;
else
return false;
}
//进栈
int push(stack *a,char n)
{
if(a->top==max-1)
return false;
a->top++;
a->num[a->top]=n;
return true;
}
//出栈
int pop(stack *a,char *n)
{
if(a->top==-1) return false;
else
{
*n=a->num[a->top];
a->top--;
return true;
}
}
//获得栈顶元素
int gettop(stack *a,char *n)
{
if(a->top==-1) return false;
else
{
*n=a->num[a->top];
return true;
}
}
//右括号与栈顶括号匹配
int match(char a,char b)
{
if(a=='('&&b==')') return 1;
else if(a=='['&&b==']') return 1;
else if(a=='{'&&b=='}') return 1;
else return 0;
}
//括号匹配
void kuohaomatch(char *str)
{
stack s;
int i;char ch;
initstack(&s);
for(i=0;str[i]!='\0';i++)
{
switch(str[i])
{
case '(':
case '[':
case '{':
push(&s,str[i]);
break;
case ')':
case ']':
case '}':
if(isempty(&s))
{
printf("no");return ;}
else
{
gettop(&s,&ch);
if(match(ch,str[i]))
pop(&s,&ch);
else
{
printf("no");return ;}
}
}
}
//读完后判断栈是否为空
if(isempty(&s))
printf("yes");
else
printf("no");
}
int main()
{
char ans[max];
cin>>ans;
kuohaomatch(ans);
return 0;
}