这个题主要考的对栈的操作,题目的意思是:有一组由小括号组成的队列S,P(i)表示当前队列中第i个右括号前面的左括号的个数,W(i)表示左括号和右括号配对成功的里面的右括号的个数(包括当前的左右括号)。要求是:输入P的值,计算输出W的值。
我的思路是:根据P的输入值计算出当前的队列S,左括号用0表示,右括号用1表示,然后用栈计算成对的括号的位置start和end,最后计算start和end之间的右括号的数量(包括end)
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "stdlib.h"
int main(int argc, char const *argv[])
{
int _i, _j, _k, start, n, m, t, sum, data[25], num[225];
int stack[225], top;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
data[0]=0, top=-1;
for(_i=1; _i<=n; _i++){
scanf("%d", &data[_i]);
}
_i=1, _j=0, start=0;
while(_i<=n){
_k = data[_i]-data[_i-1];
for(_j=start; _j<start+_k; _j++){
num[_j] = 0;
}
num[_j] = 1;
start += _k+1;
_i++;
}
for(_i=0; _i<start; _i++){
if(num[_i]==0){
top++;
stack[top] = _i;
}else if(num[_i]==1){
// printf("%d
", stack[top]);
sum = 0;
for(_j=stack[top]; _j<=_i; _j++){
sum += num[_j];
}
printf("%d ", sum);
top--;
}
}
printf("
");
}
return 0;
}