1546 - Problem E

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。

题目输入

有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。

题目输出

对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。

输入/输出样例

输入格式

4
[(d+f)*{}]
[(2+3))
()}
[4(6]7)9

输出格式

yes
no
no
no

C语言解答

#include <stdio.h>

int main()
{
	int ncase;
	scanf("%d",&ncase);
	getchar();
	while(ncase--)
	{
		char ch;
		int flag = 1;
		char a[500];
		int i = -1;
		while(scanf("%c",&ch)!=EOF && ch != '\n')
		{
			if(ch == ')' ||ch == ']' || ch == '}')
			{
				if(i==-1)
				{
					flag = 0;
				}
				else 
				{
					if((a[i] == '(' && ch == ')') ||  (a[i] == '[' && ch == ']') ||  (a[i] == '{' && ch == '}') )
					{
						i--;
					}
				}
			}
			else if(ch == '(' || ch == '[' || ch == '{')
			{
				i++;
				a[i] = ch;

			}
			else 
			{
				continue;
			}
		}
		if(flag == 0 || i != -1)
		{
			printf("no\n");
		}
		else 
		{
			printf("yes\n");
		}


	}

	return 0;
}

C++解答

#include<stdio.h>

char st[1000000];
char str[1000000];

int main() {
	int N,i,sp;
	for(scanf("%d",&N);N--;) {
		scanf("%s",str);
		for(i=sp=0;str[i];i++) {
			if (str[i]=='(' || str[i]=='[' || str[i]=='{') st[sp++]=str[i];
			else if (str[i]==')') {
				if (!sp || st[sp-1]!='(') break;
				--sp;
			} else if (str[i]==']') {
				if (!sp || st[sp-1]!='[') break;
				--sp;
			} else if (str[i]=='}') {
				if (!sp || st[sp-1]!='{') break;
				--sp;
			}
		}
		if (!str[i] && !sp) puts("yes"); else puts("no");
	}
	return 0;
}