括号匹配
问题描述
蒜头君在纸上写了一个串,只包含’(‘和’)’。一个’(‘能唯一匹配一个’)’,但是一个匹配的’(‘必须出现在’)’之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。
输入格式
一行输入一个字符串只含有’(‘和’)’,输入的字符串长度不大于50000。
输出格式
如果输入括号不能匹配,输出一行”No”,否则输出一行”Yes”,接下里若干行每行输出 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 1 开始)。你可以按照任意顺序输出。
本题答案不唯一,符合要求的答案均正确
样例输入
()()
样例输出
Yes
1 2
3 4
1 #include<iostream>
2 #include<stack>
3 using namespace std;
4 struct record{
5 char c;
6 int i;//方便记录下标,但是容易浪费空间
7 };
8 int arr[25000][2],t=0;
9 char str[50000];
10 stack<record> st;
11 int main(){
12 char ch;
13 int i=0;
14 gets(str);
15 while (str[i])
16 {
17 if (str[i]=='('){
18 //stack中只保存(,节省空间
19 record obj;
20 obj.c=str[i];
21 obj.i=i+1;
22 st.push(obj);
23 }
24 //找到第一个) ,对其进行处理,判断stack里面是否有可以匹配的(,若无,则stack为空,不满足条件
25 if (str[i]==')')
26 {
27 if (st.empty())
28 {
29 //数据 (())))))
30 cout<<"No";
31 return 0;
32 }
33 arr[t][0]=st.top().i;//取栈顶元素,获得标号
34 arr[t++][1]=i+1;
35 // cout<<arr[t-1][0]<<" "<<arr[t-1][1]<<endl;
36 st.pop();//弹出栈顶元素
37 }
38 i++;
39 }
40 if (st.empty())
41 {
42 //数据 (((())))
43 cout<<"Yes"<<endl;
44 for (int j = 0; j < t; j++)
45 {
46 cout<<arr[j][0]<<" "<<arr[j][1]<<endl;
47 }
48 }else
49 {
50 // 数据 (()
51 cout<<"No"<<endl;
52 }
53 }
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/12670857.html