这道题目好理解,就是给定一个有‘(’和‘)’组成的串,有两种表达方式,一种为p串,其每个数字为顺数括号,没碰到一个右括号就数其前面的左括号,而其值就是左括号的个数,另一中为w串,其定义为:顺数括号,没碰到一个右括号就找从与之匹配的左括号到这个右括号之间的右括号的个数,而w中的值就是右括号的值+1,这样就得到了,括号串的两中不同表达方法。题目的要求是给定一个括号串的P表达形式,输出与之相对应的w的表达形式。解题思路是首先将括号串通过p形式还原,记录在数组s【41】(由于n最大为20,且括号是匹配的,其实n就是右括号的个数,所以最多有2*20个括号,即40),另外另开一个p【20】数组用来记录P串,然后就是将括号数字化,由于串中只包含两个符号,所以可以用1和0分别表示右括号和左括号,这样也便于后来w的计数,最后就是w的计数了,这也是最关键的,其实这个就是括号的匹配,是栈的典型应用,顺次扫描s数组,没碰到数字0(即左括号)就将其在s中的位置压入栈中,没碰到数字1(即右括号)就取栈顶元素,并出栈,计数栈顶到右括号位置之间的右括号个数,并将其结构存放在record[20]中(record【20】是存放w串的),最后得出w串。本题的核心就是通过栈来模拟上面求串W的过程。下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <stack.h>
#define Max 41
int n,t;
int s[Max];
//int record[Max];
int p[20];
int result[20];
//==========================the begin of stack
typedef int typestack;
typedef struct seqs{
typestack x;
struct seqs *next;
}*seqstack,seqstackment;
bool Is_empty(seqstack &top){
return top==NULL;
}
void Push(seqstack &top,typestack v){
seqstack p=(seqstack)malloc(sizeof(seqstackment));
p->x=v;
p->next=top;
top=p;
}
typestack Pop(seqstack &top){
if(!Is_empty(top)){
seqstack p=top->next;
typestack v=top->x;
free(top);
top=p;
return v;
}
printf("栈空\n");
return 0;
}
typestack GetTop(seqstack &top){
if(!Is_empty(top))
return top->x;
printf("栈空\n");
return 0;
}
void clear_stack(seqstack &top){
while(Is_empty(top))
Pop(top);
}
/*typedef int typestack;
#define stacksize 100
typedef struct
{
int top;
typestack stack[stacksize];
}seqstack;
bool Is_empty(seqstack *);
bool Is_full(seqstack *);
void Init_stack(seqstack *);
void clear_stack(seqstack *);
void Push(seqstack *,typestack );
typestack Pop(seqstack *);
int Search_stack(seqstack *,typestack );
typestack GetTop(seqstack *);
bool Is_empty(seqstack *p){
return p->top==-1;
}
bool Is_full(seqstack *p){
return p->top==stacksize-1;
}
void Init_stack(seqstack *p){
p->top=-1;
}
void clear_stack(seqstack *p){
p->top=-1;
}
void Push(seqstack *p,typestack x){
if(Is_full(p)){
printf("栈满\n");
return ;
}
p->stack[++p->top]=x;
}
typestack Pop(seqstack *p){
if(Is_empty(p)){
printf("栈空\n");
return 0;
}
return p->stack[p->top--];
}
int Search_stack(seqstack *p,typestack x){
for(int i=0;i<=p->top;i++)
if(p->stack[i]==x)
return i+1;
printf("不存在\n");
return 0;
}
typestack GetTop(seqstack *p){
if(Is_empty(p)){
printf("栈空");
return 0;
}
return p->stack[p->top];
} */
//=========================the end of stack
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int i,j,pos;
for(i=0;i<n;i++)
scanf("%d",&p[i]);
for(i=1;i<=p[0];i++)
s[i]=0;
s[i]=1;
pos=i+1;
for(i=1;i<n;i++){
int num=p[i]-p[i-1];
while(num--)
s[pos++]=0;
s[pos++]=1;
}
//printf("%d\n",s[1]);
seqstack f=NULL;
/*seqstack x;
seqstack *f=&x;
Init_stack(f); */
memset(result,0,sizeof(result));
int index=0;
for(i=1;i<pos;i++){
if(s[i]==0)
Push(f,i);
else{
int temp=Pop(f);
for(j=temp+1;j<=i;j++)
if(s[j])
result[index]++;
index++;
}
}
for(i=0;i<index;i++)
printf("%d ",result[i]);
printf("\n");
}
return 0;
}