POJ1068Parencodings
直接看代码
1 /**************************************************** 2 思路就是吧没办法配对的左括号放在栈里, 3 如果有一个新的右括号,那他一定只能和栈顶的左括号配对 4 *****************************************************/ 5 #include <cstdio> 6 #include <stack> 7 using namespace std; 8 int ans[25], Case, N; 9 int main() 10 { 11 while(~scanf("%d", &Case))while(Case -- ) 12 { 13 stack<int>Stack;//定义一个栈,放的是还没有配对的左括号 14 int num = 0, a, pre = 0;//pre保存之前输入的数 15 scanf("%d", &N); 16 for(int i = 0; i < N; i ++ ) 17 { 18 scanf("%d", &a); 19 if(a != pre)//如果输入的不等于之前的数,表示有新的左括号 20 { 21 for(int j = pre; j < a; j ++ )//把新的左括号全部放进栈 22 { 23 Stack.push(1);//由于栈里的数表示这个左括号和与之对应的右括号之间的右括号数目 24 } //所以最开始默认为只有与其对应的那一个 25 ans[num] = Stack.top();//由于输入的数代表的是右括号,所以将与他相邻的左括号拿走 26 Stack.pop(); 27 if(!Stack.empty())Stack.top() += ans[num];//由于拿走了一个栈里的左括号, 28 num++; //也就是说新的栈顶左括号内部又多了之前括号里所拥有的右括号 29 pre = a; 30 } 31 else//输入的数等于之前的数,便是要和栈里的左括号配对 32 { 33 ans[num] = Stack.top(); 34 Stack.pop(); 35 if(!Stack.empty())Stack.top() += ans[num]; 36 num++; 37 } 38 } 39 for(int i = 0;i < num; i ++ ) 40 { 41 printf("%d%c", ans[i], (i == num-1) ? '\n':' '); 42 } 43 } 44 return 0; 45 }