列印匹配括號的個數和下標
阿新 • • 發佈:2018-12-09
題目描述
給定一個字串,列印裡面匹配的括號的個數和下標,比如“(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; }