给定三种括号{ },[ ], ( ),和若干小写字母的字符串,请问改字符串的括号是否匹配(可以嵌套)?
输入格式:字符串s。 输出格式:若匹配,输出yes,否则输出no。
输入样例:{[a(v)d]q}
输出样例:yes
// 思路 创建两个栈是不行的 还是得一个栈 然后最后计算原本字符长度和栈的长度都为0
// 那就是匹配的!
#include<stdio.h>
#include<string.h>
#define M 64
// 假如不让用 用一个数组来模拟栈
int totalR(char s[], int n);
void verify(char s[], int n);
typedef struct Stack {
char s[M] = {' '};
int top = -1;
} stack; // 记得最后有个分号
int main() {
char s[M];
scanf("%s",s);
printf("%s",s);
int n = strlen(s);
verify(s,n);
return 0;
}
void verify(char s[], int n) {
stack sta;
int i = 0;
int right = totalR(s, n);
while(i<n) {
// 如果不是字母 数字 那么就是括号
if(s[i] == '{' ||s[i] == '[' ||s[i] == '('||
s[i] == '}' ||s[i] == ']' ||s[i] == ')') {
if(s[i] == '{' ||s[i] == '[' ||s[i] == '(' ) {
sta.top = sta.top + 1;
sta.s[sta.top] = s[i];
i++;
} else if(!((s[i] == '}'&& sta.s[sta.top] == '{')||
(s[i] == ']'&& sta.s[sta.top] == '[')||
(s[i] == ')'&& sta.s[sta.top] == '('))) {
// 这里需要和原字符进行比较 遇到了右括号
break;
} else {
sta.top--;
right--;
i++;
}
} else {
i++;
}
}
if(sta.top==-1 && right==0){
printf("Yes!");
}
else{
printf("No!");
}
}
int totalR(char s[], int n){
int r_count = 0;
for(int i = 0; i < n ; i++){
if(s[i] == '}' ||s[i] == ']' ||s[i] == ')')
r_count = r_count + 1;
}
return r_count;
}