1. 程式人生 > >列印匹配括號的個數和下標

列印匹配括號的個數和下標

題目描述

給定一個字串,列印裡面匹配的括號的個數和下標,比如“(1)23(4()5)6”,一共有3對括號,0和2是一對,5和10是一對,7和8是一對。輸入資料的括號均能成對出現,以下輸入是不存在的:"((1)",兩個左括號有一個無法成對。

輸入描述

一個包含數字和括號的字串,一行。

輸出描述

多行輸出,第一行是成對括號的個數,後續每行是一個括號的下標。

示例

輸入

(1)23(4()5)6

輸出

3

0

2

5

10

7

8

說明:有3對成對的括號,每次輸出一對的下標,輸出順序以左括號所在下標的升序排列,故0、2一對,5、10一對,7、8一對。

思路

遇到左括號將下標入棧,因為每個左括號都有與之匹配的右括號,所以遇到左括號的時候就直接計數;遇到右括號將棧頂下標和當前下標存到map中,彈出棧頂,map可以自動排序,方便輸出。

#include <iostream>
#include<stdio.h>
#include<string>
#include<stack>
#include<map>
using namespace std;

int main()
{
    string str;
    cin>>str;
    stack<int> stk;
    map<int,int> indexMap;
    int cnt=0;
    for(int i=0;i<str.length();++i){
        if(str[i]=='('){
            cnt++;
            stk.push(i);
        }
        else if(str[i]==')'){
            int n=stk.top();
            indexMap.insert({n,i});
            stk.pop();
        }
    }
    printf("%d\n",cnt);
    for(auto m:indexMap){
        printf("%d\n%d\n",m.first,m.second);
    }
    return 0;
}