括号匹配

问题描述

蒜头君在纸上写了一个串,只包含’(‘和’)’。一个’(‘能唯一匹配一个’)’,但是一个匹配的’(‘必须出现在’)’之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。 
输入格式 
一行输入一个字符串只含有’(‘和’)’,输入的字符串长度不大于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 }

 

posted @ 2020-04-10 01:36  多发Paper哈  阅读(190)  评论(0编辑  收藏  举报
Live2D