VJ_扩号匹配_stack

判断一组匹配的左右扩号序列中,每一个右扩号与之相匹配成对的左扩号是整个扩号序列的第几个扩号。输出所有判断结果。

Input

输入有两行。
第一行输入一个整数(该整数必定是偶数),该整数表示扩号序列中一共有多少个扩号。
第二行输入用1和2分别代表左右扩号的扩号序列。例如输入序列11211222,表示扩号序列(()(()))。

Output

输出为一行。即挨个输出每个2(右扩号‘)’)与之相匹配的1(左扩号‘(’)在扩号序列中是第几个,用空格格开。

Sample

Inputcopy Outputcopy
4
1212
4
1122
6
112122
8
11211222
20
11211122122121122212
1 3
2 1
2 4 1
2 5 4 1
2 6 5 9 4 12 15 14 1 19

Hint

输入的扩号总数一定为偶数。输入的12序列必定是匹配的,1和2的个数相等,必为扩号总数的一半。
测试数据有多组,采用while()循环输入。

//
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,i;
   	char ch; 				// char

    while( cin>>n )
    {
        stack<int> sk;
        vector<int> v;
        
        for( i=1;i<=n;i++ )
        {
            cin>>ch;		
            if( ch=='1' ) { sk.push( i ); continue; }
            v.push_back( sk.top() ); sk.pop();
        }
        for( i=0;i<v.size();i++ )
        {
            if( i ) cout<<" ";
            cout<<v[i];
        }
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125135225
今日推荐