学习队列相关知识
?
题目
欢迎大家加入ACM! 要深入的学习ACM的相关知识,首先就必须学会一门编程语言,推荐C/C++。 不过对于初学者,因为没编过多少代码,经常出现变异错误,其实就是语法错误。 现在要你检查一段代码的语法是否否正确。 为了简化问题,我们只检查 (、)、{、} 括号是否匹配了,并且在输入的代码中不包含字符的'(',')','{','}'。 其他语法错误不检查,如 "#include <stdio.h","2 = x",是错误的,但是不检查。
输入
有多组测试数据,每组测试数据有一段代码,该段代码可能在有多行。 每段代码以Ctrl+Z结束。 处理到文件结束。
输出
每组测试数据输出一行。 如果这段代码括号匹配了,输出 Right ,否则输出 Wrong。
样例输入
#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
样例输出
Right Wrong
代码如下
(只会对一串以"Ctrl+Z"为结束符的字符串检测是否匹配)
#include<stdio.h>
#define size 30
int stack[30];
int top=0;
int flag = 1;
void push(char x)
{
if (top < size)
{
stack[top] = x;
top++;
}
}
char pop()
{
if (top == 0)
return '\0';
top--;
return stack[top];
}
void check(char x, char y)
{
if (x == '#')
{
printf("Wrong");
flag = 0;
}
if (x!=y)
{
printf("Wrong");
flag = 0;
}
}
int main()
{
char ch, out;
push('#');
ch = getchar();
while (ch != 'Ctrl+Z')
{
switch (ch)
{
case'(':
case'[':
case'{':push(ch); break;
case')':out = pop(); check(out, '('); break;
case']':out = pop(); check(out, '['); break;
case'}':out = pop(); check(out, '{'); break;
}
if (flag == 0)
return 0;
ch = getchar();
}
out = pop();
if (out == '#')
printf("Right");
else
printf("Wrong");
return 0;
}
|