检查一段C语言代码的小括号( )
、 中括号 [ ]
和大括号{ }
是否匹配。
输入格式:
在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束)。
输出格式:
第一行输出左括号的数量和右括号的数量,中间以一个空格间隔。
若括号是匹配的,在第二行打印YES
,否则打印NO
。
输入样例1:
for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }
输出样例1:
8 8
YES
输入样例2:
for(int i=0; i<v; i++) a(i]=0;
输出样例2:
2 2
NO
解决
#include<stdio.h>
#include<string.h>int left(char c) // 判断是不是左括号
{return (c == '(' || c == '{' || c == '[');
}int right(char c) // 判断是不是右括号
{return (c == ')' || c == '}' || c == ']');
}int check(char left, char right) // 判断左右括号是否匹配
{if (left == '('){return right == ')';}else if (left == '{'){return right == '}';}else{return right == ']';}
}int main()
{char stack[1005]; // 存左括号们的栈int top = 0; // 栈顶char s[1005]; // 输入的字符串int leftnum,rightnum;leftnum=0,rightnum=0;int flag=1;fgets(s, sizeof(s), stdin); // 使用 fgets 读取一行字符串int l = strlen(s);for (int i = 0; i < l; i++){if (left(s[i])){stack[top++] = s[i]; // 左括号入栈leftnum++;}else if (right(s[i])){rightnum++;if (top == 0 || !check(stack[--top], s[i])) // 栈空或左右括号不匹配{flag=0;}}}printf("%d %d\n",leftnum,rightnum);if (top == 0 && flag==1) // 如果栈空了{printf("YES\n");}else{printf("NO\n"); // 栈没空}return 0;
}