题意:
模拟出栈顺序
解答:
对于每行要测试的数据,单独进行模拟验证,符合要求输出YES,否则输出NO。
再验证流程:
1. 设置一个索引 index = 0,如果第一个待检测数值为X,则把 index+1 ~ X的数据全部入栈,并把 index 设置为 X,同事还要保证栈的容量不能超标。之后再弹出栈顶原素,和第一个待检测数值比较。
2. 接着判断第二待检测原素Y,如果 index > Y,则直接从栈顶弹出原素和Y比较。如果 index < Y,把 index+1 ~ Y的数据全部入栈,并把 index 设置为 Y,同时还要保证栈的容量不能超标。之后再弹出栈顶原素,和待检测数值 Y 比较。
再弹出栈顶原素和待检测数值比较时,需要判断栈顶是否为空。
3. 重复操作 2 即可
在比较过程中,发现不符号要求即可终止判断。
再弹出栈顶原素和待检测数值比较时,需要判断栈顶是否为空。
3. 重复操作 2 即可
在比较过程中,发现不符号要求即可终止判断。
具体java代码如下:
import java.util.*;
public class Main{
static int M;
static int N;
static int K;
static int[] a;
public static void main(String[] args){
Scanner in=new Scanner(System.in);
M=in.nextInt();
N=in.nextInt();
K=in.nextInt();
a=new int[N];
for(int i=0;i<K;i++){
for(int j=0;j<N;j++){
a[j]=in.nextInt();
}
seq(a);
}
}
public static void seq(int[] a){
int index=0;
Stack<Integer> stack=new Stack();
for(int j=0;j<N;j++){
if(a[j]>index){
for(int k=index+1;k<=a[j];k++){
stack.push(k);
if(stack.size()>M){
System.out.println("NO");
return;
}
}
index=a[j];
}
if(stack.isEmpty()){
System.out.println("NO");
return;
}
int val=stack.pop();
if(val!=a[j]){
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
}