出栈合法性
题目描述
已知自然数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
[实例代码]
1 package homework; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 public class aaaaa { 7 8 public static void main(String[] args) { 9 Scanner scanner =new Scanner(System.in); 10 int N=scanner.nextInt(); //表示有多少的元素要进栈分别为1、2、3...N-1、N 11 int[] R=new int[100];//用来表示结果,如果为1代表合法,否则不合法 12 int L=0;//R数组的下标 13 while(N!=0) { //‘0’代表退出 14 int[] data=new int[N];//装输入出栈结果 15 int[] temp=new int[N];//装正确的进栈结果,用于跟data匹配 16 for(int i=0;i<N;i++) { 17 data[i]=scanner.nextInt(); 18 temp[i]=0;//先赋值为0,表示车还没有进栈 19 } 20 int j=0,k=0,i=1;//j和k分别用于temp数组和data数组匹配,i为车进栈的顺序或者说是车牌号 21 while(i<=N) {//车准备好啦 22 if(j>=0&&temp[j]==0) { //如果当前这个位置没有车,那就进来一辆车 23 temp[j]=i++;//按顺序进栈 24 } 25 if(j<0) {//假如刚进来一辆车就出去,那么j可能小于0,防止下标越界 26 j++; 27 continue; 28 } 29 while(j>=0&&data[k]==temp[j]) {//已经进栈的车如果和输出出栈的顺序匹配,那就出栈一辆车,直到不匹配为止或是车全部出栈 30 k++; 31 temp[j]=0;//车出栈之后,改位置没有车,于是置为零,等待下一辆车进栈 32 j--; 33 } 34 j++; 35 } 36 if(temp[0]==0) {//如果车出栈顺序正确,那么车站里没有车,那么第一个位置为空,即为‘0’,否则不为‘0’ 37 R[L]=1;//正确置为1,否则为0 38 }else { 39 R[L]=0; 40 } 41 L++; 42 N=scanner.nextInt(); 43 } 44 for(int i=0;i<L;i++) {//输出格式 45 if(R[i]==1) { 46 System.out.println("Yes"); 47 }else { 48 System.out.println("No"); 49 } 50 } 51 } 52 }
【解题思想】