题目描述
已知自然数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
题解
已知入栈的顺序是按照自然数的顺序。那么在这种栈之中,对于任何一个元素来说,当它进栈的时候,它下面的元素必然都比它小。因为我们前面所有元素都是按照从小到大的顺序进栈的。而出栈的时候呢,当这个大的元素出栈的时候,后面接着要出栈的元素里只要是原来它下面的元素,就必然一个比一个小。所以,我们也可以概括成这样,对于栈里任何一个出栈的元素来说,生成的序列里它后面所有比它小的元素必然构成一个递减的序列。 所以,按照这个规律,我们可以来判断一个给定的序列是否为通过入栈出栈生成的。
判断条件: 对于栈里任何一个出栈的元素来说,生成的序列里它后面所有比它小的元素必然构成一个递减的序列。
AC 代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
if(n==0)break;
int[] a = new int[n];
for(int i=0;i<n;i++)
a[i] = scanner.nextInt();
int tag = 1;
for(int i=0;i<n;i++){
int cur = a[i];
for(int j = i+1; j<n;j++){
if(a[j]<a[i]){//找到该序列中比 i 这个数 还小的数
if(a[j]<cur)
cur = a[j];//更新最小数
else {
tag = 0;break;//非递减序列 跳出循环
}
}
}
}
if(tag==0)
System.out.println("No");
else {
System.out.println("Yes");
}
}
}
}