題目描述
假設入棧序列爲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");
}
}