题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1170
Time Limit: 1000 MS Memory Limit: 65536 K
Description
欢迎大家加入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
Problem solving report:
Description: 判断'(',')','{','}'配对是否合法。
Problem solving: 这个只需要维护一个栈就行了,遇到'('、'{'就进栈,遇到')'、'}'就判断栈顶元素是不是与之配对的'('、'{',是就出栈不是就不合法。
Accepted Code:
#include <bits/stdc++.h>
using namespace std;
typedef char ElemType;
typedef struct ListPtr {
ElemType data;
ListPtr *prior;
}*lists;
int len;
lists head, tail;
void Alloc(lists &p) {
p = (ListPtr *)malloc(sizeof(ListPtr));
p -> prior = NULL;
}
void link() {
len = 0;
Alloc(head);
tail = head;
}
void push(ElemType e) {
lists p;
Alloc(p);
p -> data = e;
p -> prior = tail;
tail = p;
len++;
}
void pop() {
len--;
lists p = tail;
tail = tail -> prior;
free(p);
}
ElemType top() {
return tail -> data;
}
int main() {
int tmp;
char str[1005], s[105];
while (~scanf("%s", str)) {
while (scanf("%s", s)) {
if (!strcmp(s, "Ctrl+Z"))
break;
strcat(str, s);
}
link();
tmp = 0;
for (int i = 0; str[i]; i++) {
if (str[i] == '(' || str[i] == '{')
push(str[i]);
else {
if (str[i] == ')') {
if (!len || top() != '(') {
tmp = 1;
break;
}
else pop();
}
else if (str[i] == '}') {
if (!len || top() != '{') {
tmp = 1;
break;
}
else pop();
}
}
}
if (tmp || len)
printf("Wrong\n");
else printf("Right\n");
}
return 0;
}