题目:
欢迎大家加入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; }