1068 - 出栈合法性

已知自然数1,2,...,N(1<=N<=100)依次入栈,请问序列C1,C2,...,CN是否为合法的出栈序列。

题目输入

输入包含多组测试数据。
每组测试数据的第一行为整数N(1<=N<=100),当N=0时,输入结束。
第二行为N个正整数,以空格隔开,为出栈序列。

题目输出

对于每组输入,输出结果为一行字符串。
如给出的序列是合法的出栈序列,则输出Yes,否则输出No。

输入/输出样例

题目输入

5
3 4 2 1 5
5
3 5 1 4 2
0

题目输出

Yes
No

C语言解答

#include <stdio.h>
void main()
{
  int i,a[100],k,count,key,n,j,b[100];
  scanf("%d",&n);
  while(n!=0)
  {
    k=key=0;
    for(i=0;i<n;i++)
      scanf("%d",&a[i]);
    for(i=0;i<n;i++)
    {
		count=0;
      for(j=i+1;j<n;j++)
      {
        if(a[j]<a[i])
        {b[count]=a[j];
         count++;}
      }
      for(k=0;k<count-1;k++)
      {
        if(b[k]<b[k+1])
        key=1;
      }
    }
    if(key==0)
      printf("Yes\n");
	else
		printf("No\n");
     scanf("%d",&n);
  }
}

C++解答

#include <stdio.h>

int top;

int Stack(int stack[], int a, int &pre)
{
	if (a <= pre)
	{
		if (stack[--top] != a)
		{
			//printf("%d %d\n", stack[top],a);
			return 0;
			
		}
		else return 1;
	}
	for (int i = pre + 1; i <= a; i++)
	{
		stack[top++] = i;
	}
	top--;
	pre = a;
	return 1;
}

int main(int argc, char *argv[])
{
	int n;
	int a, stack[105];
	while (scanf("%d", &n) != EOF)
	{
		if(n==0) break;
		top = 1;
		stack[0]=0;
		int pre = 0;
		int flag = 1;
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &a);
			if (flag == 1)
			{
				flag = Stack(stack, a, pre);
				/*for (int j=1; j<top; j++ )
				{
					printf("%d ",stack[j]);
				}
				printf("\n");*/
			}
		}

		if (flag == 1)
		{
			printf("Yes\n");
		}else
			printf("No\n");
	}
	
	return 0;
}

时间限制 1 秒
内存限制 32 MB
讨论 统计
上一题 下一题