括号序列【栈】

链接:https://ac.nowcoder.com/acm/contest/3005/B
来源:牛客网
 

给出一个仅包含'[',']','(',')','{','}'六种字符的括号序列,判断其是否合法。

  • 空串是一个合法的括号序列
  • 如果A, B 都是合法的括号序列,那么AB也是合法的括号序列
  • 如果A是合法的括号序列,(A) , [A], {A}都是合法的括号序列

输入描述:

一行一个字符串S,只包含题目中的六种括号字符

输出描述:

输出为一行"Yes" 或"No"

示例1

输入

复制(){}[]

(){}[]

输出

复制Yes

Yes

示例2

输入

复制({[]})

({[]})

输出

复制Yes

Yes

示例3

输入

复制([)]

([)]

输出

复制No

No

备注:

1≤∣S∣≤1000000


 

使用栈,从左到右处理每一个括号:

  • 如果是左括号,那么入栈,然后继续读下一个括号

  • 如果是右括号,那么就要看这个右括号和栈顶的括号是否匹配

  • 如果匹配,那么弹出栈顶的括号,继续读下一个括号,否则说明不合法

  • 最后,如果栈为空,说明此括号序列是合法的。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
stack<char>s;
int main()
{
	string a;
	int flag=1;
	cin>>a;
	int l=a.size();
	if(l%2!=0)
	 {
	 cout<<"No"<<endl;return 0;}
	for(int i=0;i<l;i++)
	{
		if(a[i]=='('||a[i]=='{'||a[i]=='[')
		s.push(a[i]);//进栈
		else if(!s.empty())
		{
			if(a[i]==')'&&s.top()=='(')
			s.pop();//弹出
			if(a[i]=='}'&&s.top()=='{')
			s.pop();
			if(a[i]==']'&&s.top()=='[')
			s.pop();
		}
		else {
		flag=0;break;}
	}
	
	if(flag&&s.empty())
	cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
	return 0;
 } 

 

链接:https://ac.nowcoder.com/acm/contest/3007/G
来源:牛客网
 

题目描述

合法括号序列的定义是:

1.空序列是合法括号序列

2.如果 S 是一个合法括号序列,那么(S)是合法括号序列

3.如果 A 和 B 都是合法括号序列,那么 AB 是一个合法括号序列

现在给定一个括号序列,求最少删去几个括号能得到一个合法的括号序列

输入包含 T 组数据,每组数据中,设括号序列的长度为 N

1≤T,ΣN≤1,000,000

(由于空串是合法的括号序列,所以答案可以是N)

输入描述:

 

第一行一个数字 T

接下来 T 组数据共 2T 行,每组数据第一行是 N

第二行则是一个长度为 N 的括号序列

输出描述:

 

T 行 T 个数字,表示输入的括号序列最少删去几个括号能得到一个合法的括号序列

示例1

输入

复制2 6 ())(() 9 ()(()()))

2
6
())(()
9
()(()()))

输出

复制2 1

2
1
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	int t;
	
	string s;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int x=0,y=0;
		cin>>s;
		getchar();
		for(int i=0;i<n;i++)
		{
			if(s[i]=='(') x++;
			else if(s[i]==')'&&x==0) y++;
			else if(s[i]==')'&&x!=0) x--;
		
		}
		
		cout<<x+y<<endl;
		
	}
	return 0;
	
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值