题目:
欢迎大家加入ACM!
要深入的学习ACM的相关知识,首先就必须学会一门编程语言,推荐C/C++。
不过对于初学者,因为没编过多少代码,经常出现变异错误,其实就是语法错误。
现在要你检查一段代码的语法是否否正确。
为了简化问题,我们只检查 (、)、{、} 括号是否匹配了,并且在输入的代码中不包含字符的’(’,’)’,’{’,’}’。
其他语法错误不检查,如 “#include <stdio.h”,“2 = x”,是错误的,但是不检查。
Input
有多组测试数据,每组测试数据有一段代码,该段代码可能在有多行。
每段代码以Ctrl+Z结束。
处理到文件结束。
Output
每组测试数据输出一行。
如果这段代码括号匹配了,输出 Right ,否则输出 Wrong。
Sample Input
#include <stdio.h
int main(){
int a b;
while (scanf("%d%d", &a, &b) != EOF) {
printf("%d\n", a + b);
}
}
Ctrl+Z
int main(){
int a, b;
while (scanf("%d%d", &a, &b) != EOF) {
printf("%d\n", a + b);
}
Ctrl+Z
Sample Output
Right
Wrong
题意描述:给一段代码判断这段代码会不会出现 “(” “)”“{” “}”括号的语法错误;
解题思路:把每段代码用二维数组存入,如果输入“Ctrl+Z”表示输入结束,用queue栈去分别存入“()"和”{}“,最后判断代码是否正确。代码如下:
程序代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
char a[10000][10000];//二维数组去存储代码
int main()
{
while(scanf("%s",a[0])!=EOF)//题意表示至少也要输入一行代码
{
int i=1;
while(scanf("%s",a[i])!=EOF)
{
if(strcmp(a[i],"Ctrl+Z")==0) //用字符串函数判断是否输入结束
break;
i++;
}
queue<char> s[2];//用栈分别去存储两种括号
int flag=1;
int k,j;
for(k=0;k<i;k++)
{
for(j=0;a[k][j]!='\0';j++)
{
if(a[k][j]=='(')
{
s[0].push(a[k][j]);//进栈
continue;
}
if(a[k][j]=='{')
{
s[1].push(a[k][j]);//进栈
continue;
}
if(a[k][j]==')'&&s[0].empty()==0)
{
s[0].pop();//出栈
continue;
}
if(a[k][j]==')'&&s[0].empty()==1)//如果输入当前括号且栈为空表示输入代码一定错误
{
flag=0;
break;
}
if(a[k][j]=='}'&&s[1].empty()==0)
{
s[1].pop();
continue;
}
if(a[k][j]=='}'&&s[1].empty()==1)
{
flag=0;
break;
}
}
if(flag==0)
break;
}
if(flag)
{
if(s[0].empty()==1&&s[1].empty()==1)
cout<<"Right"<<endl;
else
cout<<"Wrong"<<endl;
}
else
cout<<"Wrong"<<endl;
}
return 0;
}