括号匹配

题目:
蒜头君在纸上写了一个串,只包含’(‘和’)’。一个’(‘能唯一匹配一个’)’,但是一个匹配的’(‘必须出现在’)’之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。
输入格式
一行输入一个字符串只含有’(‘和’)’,输入的字符串长度不大于50000。
输出格式
如果输入括号不能匹配,输出一行”No”,否则输出一行”Yes”,接下里若干行每行输出 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 1 开始)。你可以按照任意顺序输出。
本题答案不唯一,符合要求的答案均正确
样例输入
()()
样例输出
Yes
1 2
3 4

代码如下:

#include<bits/stdc++.h>
using namespace std;
char a[50005];
struct Node
{
	int num2;
	char c;
	Node() {}
	Node(int i,char b):num2(i),c(b) {}
}node;
int main()
{
	int num;
	bool flag = true;
	stack<Node> s;
	map<int,int> q;
	cin >> a;
	num = strlen(a);
	for(int i = 0;i < num;i++){
		if(a[i] == '('){
			node = Node(i,a[i]);
			s.push(node);
		} 
		else if(a[i] == ')'){
			if(s.empty()) {flag = false;break;}
			else{
				node = s.top();
				if(node.c != '(') {flag = false;break;}
				q[node.num2 + 1] = i + 1;
				s.pop();
			}
		}
	}
	if(!s.empty() || !flag) cout << "No" << endl;
	else{
		cout << "Yes" << endl;
		map<int,int>::iterator it;
		for(it = q.begin();it != q.end();it++) cout << it -> first << " " << it -> second << endl;
	}
	return 0;	
} 

这道题要靠栈来判断括号是否匹配,而最后输出则要依靠map来实现对应关系。输入一行字符串如果是‘(’,那么压入栈就可以了,注意这里压入的是一个结构体(包括字符和其所在的序号)。如果遇到的是‘)’,那么就要把栈顶元素出栈查看是否是‘(’,如果不是‘(’或者栈为空了那就不匹配。否则就把栈顶元素拿出,然后用map来记录两个括号在字符串中的位置,就这样一直处理到字符结束。全部处理完之后如果发现栈不是空的,那也是不匹配的。如果此时栈为空那就输出Yes,然后将map中的元素全部打印出来即可。

其实这里边输入边判断也可以,上面的代码还可以缩短…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值