POJ1068-Parencodings

  这个题主要考的对栈的操作,题目的意思是:有一组由小括号组成的队列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\n", stack[top]);
				sum = 0;
				for(_j=stack[top]; _j<=_i; _j++){
					sum += num[_j];
				}
				printf("%d ", sum);
				top--;
			}
		}
		printf("\n");
	}
	return 0;
}
posted @ 2014-09-21 00:40  前端小茶馆  阅读(190)  评论(0编辑  收藏  举报