语法检查-括号匹配 | ||||||
| ||||||
Description | ||||||
欢迎大家加入ACM! | ||||||
Input | ||||||
有多组测试数据,每组测试数据有一段代码,该段代码可能在有多行。 | ||||||
Output | ||||||
每组测试数据输出一行。 | ||||||
Sample Input | ||||||
#include <stdio.h | ||||||
Sample Output | ||||||
Right | ||||||
Author | ||||||
黄李龙 |
0.0稍微复杂一点的括号匹配,不过稍加处理就好,用两个栈;一个用来存()一个用来存{ }就行了~
遇到了一个(push进去,遇到一个)pop出来、
同理,另一个栈,遇到一个{push进去,遇到一个}pop出来、
如果栈空的时候遇到了)或者是},用一个标记一下已经不合理了、
然后处理到最后的时候,如果没有特殊标记的话,同时两栈为空, 那么就是right,否则为wa
#include<stdio.h>
#include<string.h>
#include<stack>
#include<algorithm>
using namespace std;
char a[10000][10000];
int main()
{
while(~scanf("%s",a[0]))
{
int i=0;
while(1)
{
i++;
scanf("%s",a[i]);
if(strcmp(a[i],"Ctrl+Z")==0)
{
break;
}
}
int ok=0;
stack<char >s[2];
for(int j=0;j<=i;j++)
{
for(int k=0;a[j][k]!='\0';k++)
{
if(a[j][k]=='(')
{
s[0].push(a[j][k]);
continue;
}
if(a[j][k]=='{')
{
s[1].push(a[j][k]);
continue;
}
if(a[j][k]==')'&&s[0].size()!=0)
{
s[0].pop();
continue;
}
if(a[j][k]==')'&&s[0].size()==0)
{
ok=1;
continue;
}
if(a[j][k]=='}'&&s[1].size()==0)
{
ok=1;
continue;
}
if(a[j][k]=='}'&&s[1].size()!=0)
{
s[1].pop();
continue;
}
}
}
if(ok==0)
{
if(s[0].size()==0&&s[1].size()==0)
{
printf("Right\n");
}
else
{
printf("Wrong\n");
}
}
else
{
printf("Wrong\n");
}
}
}