检查一段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;
}