DS||棧的操作問題

題目描述
假設入棧序列爲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");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章