UVA 673-Parentheses Balance(括号匹配)

题干:

You are given a string consisting of parentheses () and []. A string of this type is said to be correct:(a) if it is the empty string(b) if A and B are correct, AB is correct,(c) if A is correct, (A) and [A] is correct.Write a program that takes a sequence of strings of this type and check their correctness. Yourprogram can assume that the maximum string length is 128.

Input

The file contains a positive integer n and a sequence of n strings of parentheses ‘()’ and ‘[]’, one stringa line.

Output

A sequence of ‘Yes’ or ‘No’ on the output file.

Sample Input

3

([])

(([()])))

([()[]()])()

Sample Output

Yes

No

Yes

思路:

这道题一开始的想法是找出那些不合适的情况,排除掉他们,剩下的都是Yes。但在写的时候忽略了空串的情况,导致一开始没做出来。而且这个地方不能使用scanf("%s",a) 和cin,他们读不了'\n',用这两个就无法解决空串的情况。所以这个地方用gets或者一个字符一个字符的读入。gets有的地方不能用,会编译错误,这个题中编译器选择 C++11 5.3.0 就可以。后来看了题解发现这个题也可以用栈做,不过刚开始也是没考虑到空串的情况。

非栈的代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring> 
using namespace std;
//  奇数× ][   [(])  [[((]])) 

int cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int n;
	char a[140];
	cin>>n;
	getchar(); 
	while(n--){
		int  l1=0,r1=0,l2=0,r2=0;
		gets(a);
		int fl1=0,fl2=0,flag=0;
		int l=strlen(a);
		for(int i=0;i<l;i++)
		{
			if(a[i]=='(')
			{
				l1++;
				fl1++;
			}
			else if(a[i]==')')
			{
				r1++;fl1--;
			}
			else if(a[i]=='[')
			{
				l2++;fl2++;
			}
			else if(a[i]==']')
			{
				r2++;fl2--;
			}
			
			if(fl1<0||fl2<0||a[i]=='('&&a[i+1]==']'||a[i]=='['&&a[i+1]==')')
			flag=-1;
		}
		if(l%2==1)//l&1
		{
			printf("No\n");
		}
		else if(l1!=r1||l2!=r2)
		{
			printf("No\n");
		}
		else if(flag==-1)
		{
			printf("No\n");
		}
		else printf("Yes\n");
	}
	return 0;
}

栈的代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring> 
#include<stack> 
using namespace std;
int main()
{
	int n;
	cin>>n;
	getchar(); 
	while(n--){
		stack<char> ss;
		char a;
		int flag=1;
		
		while (cin.get(a) && a != '\n')
		{
			if(a==')')
			{
				if(ss.empty())
				flag=0;
				else if(ss.top()=='(')
				ss.pop();
				else flag=0;
					
			}
			else if(a==']')
			{
				if(ss.empty())
				flag=0;
				else if(ss.top()=='[')
				ss.pop();
				else flag=0;
			}
			else ss.push(a);
		//	if(flag==0)break;
		}
		
		if(flag&&ss.empty())
		{
			printf("Yes\n");
		}
		else printf("No\n");
	}
	return 0;
}

总结:

1、这道题感觉和回文的有点类似,以后再见到这样的找匹配的题目是应考虑一下栈。

2、对字符串操作时不一定是一次性读入更好,有时更需要一个字符一个字符的读

3、注意题干中给的信息,这道题因为空串错了好几遍


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值