题目描述
假设入栈序列为1 2 3 4 … n,则出栈序列是1到n的一个排列。 假设用P表示入栈操作,用Q表示出栈操作,则栈操作过程可以表示为一个由P和Q构成的序列。 对一个给定的出栈序列,应该如何操作才能得到呢?
输入
输入由若干行构成,每一行是一组由空格间隔开的整数,第一个整数是序列的长度n(n不大于1000),后面是一个1到n的排列。
输出
对每一行输入,计算对应的栈操作序列,并输出此操作序列,如果不能输出此序列,则在不能操作的位置输出"error"。
样例输入 Copy
4 1 2 3 4
4 4 3 2 1
4 4 2 1 3
4 3 1 2 4
样例输出 Copy
PQPQPQPQ
PPPPQQQQ
PPPPQ error
PPPQ error
#include "stdio.h"
#include "string.h"
int main()
{
int s[1001],a[1001],n,i,j,top,num;
while(scanf("%d",&n)!=EOF)
{
memset(s,0,sizeof(s));
num=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
top=a[0];
for(i=0;i<top;i++)
{
printf("P");
}
printf("Q");
s[top-1]=1;
for(i=1;i<n;i++)
{
for(j=top-2;j>=0;j--)
{
if(s[j]==0)
{
top=j+1;
break;
}
}
if(a[i]==top)
{
printf("Q");
s[top-1]=1;
top=a[i];
}
else if(a[i]>top)
{
for(j=top;j<a[i];j++)
{
if(s[j]==0)
printf("P");
}
printf("Q");
top=a[i];
s[top-1]=1;
}
else
{
printf(" error");
break;
}
}
printf("\n");
}
}