括号匹配
问题描述
蒜头君在纸上写了一个串,只包含’(‘和’)’。一个’(‘能唯一匹配一个’)’,但是一个匹配的’(‘必须出现在’)’之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。
输入格式
一行输入一个字符串只含有’(‘和’)’,输入的字符串长度不大于50000。
输出格式
如果输入括号不能匹配,输出一行”No”,否则输出一行”Yes”,接下里若干行每行输出 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 1 开始)。你可以按照任意顺序输出。
本题答案不唯一,符合要求的答案均正确
样例输入
()()
样例输出
Yes
1 4
2 3
分析:如果遇到左括号,就放入栈中(该左括号的下标),如果遇到右括号,就从栈顶中取出一个;
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
int arr[50010];
char ch[50010];
stack<int>s;
int main() {
cin >> ch;
bool vis = true;
//放入栈中;
int len = strlen(ch);
for (int i = 0;i <len;i++) {
if (ch[i] == '(') {
s.push(i+1); //把字符的小标输入到stack
}
else {
if (!s.empty()) {
arr[i+1] = s.top();
s.pop();
}
else {
vis = false;
break;
}
}
}//有就弹出一个‘(’,无则false;
if (s.empty() && vis) {
cout << "Yes" << endl;
for (int i = 1;i <= len;i++) {
if (arr[i]) {
cout << arr[i] <<' '<< i<<endl;
}
}
}
else cout << "No" << endl;
return 0;
}