1068 - 出栈合法性

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

已知自然数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;
}

Java解答

import java.util.Scanner;
import java.util.Stack;

public class Main {
	public static void main(String[] args) {
		int n = 0;
		Scanner in = new Scanner(System.in);

		while ((n = in.nextInt()) != 0) {
			int a[] = new int[100];
			for (int i = 0; i < n; i++)
				a[i] = in.nextInt();
			Stack s = new Stack();
			int index = 0;
			for (int i = 1; i <= n; i++) {
				s.add(i);
				while(!s.isEmpty()){
					if (Integer.parseInt(s.lastElement().toString()) == a[index]) {
						index++;
						s.pop();
					}else break;
				}
			}

			if (s.isEmpty())
				System.out.println("Yes");
			else
				System.out.println("No");

		}
	}
}

Python解答

import sys

def stackQue(n,ls):
    if len(ls)!=n:
        return False     
    i=0
    while i<len(ls):
        tmpl=[c for c in ls[i:] if ls[i]>c]
        if not isSort(tmpl):
            return False
        i+=1
    return True

def isSort(ls,reverse=False):
    if not reverse:
        i=0
        while i<len(ls)-1:
            if ls[i]<ls[i+1]:
                return False
            i+=1
        return True
          
i = 0          
for line in sys.stdin:
    a = line.split()
    n = len(a)
    ls = map(lambda x:int(x),a)
    
    
    if n == 1 and ls[0]==1:
           i +=1
           if i%2 == 0:
               print 'Yes'

    if 1< n <= 100:      
            re = stackQue(n,ls)
            if re is True:
               print 'Yes'
            else:
               print 'No'