UVA 673-Parentheses Balance(括号匹配)

本文通过两种方法解决了括号匹配问题:一种是非栈方法,通过直接检查括号序列来判断是否匹配;另一种是栈方法,利用栈的数据结构特性来验证括号是否正确配对。文章还分享了编程技巧,如如何正确处理空字符串输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题干:

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、注意题干中给的信息,这道题因为空串错了好几遍


内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值