题目
思路
-
利用栈的特性。
-
定义一个辅助数组。
-
遍历字符:(若字符的个数为奇数,则直接返回false,因为一定有不匹配的)
-
若是左括号,则将对应右括号入栈;
-
若字符还没遍历完辅助数组的top就等于-1(有右括号没有匹配上)或出栈的字符与遍历的字符不相等,则返回false。
-
否则就出栈(出栈的一定与遍历的相同,否则就会执行上一步,不会执行这步)
-
-
最后返回表达式top==-1。若相等则返回true,若不等(有右括号没有匹配),返回false。
#include<stdio.h>
#include<string.h>
#define MaxSize 1000
//初始化栈
void initStack(char *s,int *top){
*top=-1;
}
//入栈
void push(char *s,int *top,char c){
s[++(*top)]=c;
}
//出栈
char pop(char *s,int *top){
return s[(*top)--];
}
//获取栈顶元素
char getTop(char *s,int *top){
return s[*top];
}
//判断括号是否匹配
bool isValid(char *s){
int len=strlen(s);
if(len%2!=0)
return false;
char st[MaxSize];//辅助栈
int top=-1;
for(int i=0; i<len; i++){
if(s[i]=='(')
push(st,&top,')');//入栈
else if(s[i]=='[')
push(st,&top,']');
else if(s[i]=='{')
push(st,&top,'}');
else if(top==-1||getTop(st,&top)!=s[i])
return false;
else
pop(st,&top);//出栈
}
return top==-1;
}
int main(){
char s[]="{}";
if(isValid(s))
printf("有效字符");
else
printf("无效字符");
return 0;
}