滴!又是一个笔试题总结!
1、题目说明:
铁路货车编组站如图显示,A点有K节车厢,所有车厢都须从A点进入,经C点道岔后,重新编组到B点。
如:A点有车厢1-2-3(左—右),经C编组,到B点后,可以被编组成1-2-3,1-3-2,2-1-3,2-3-1,3-2-1等几种可能的编组。
问:
A有车厢编组(左—右)1-2-3-4,列车在经过编组后,能否在B点编组成4-1-3-2的顺序,请给出算法证明?
2、题目分析:
我们仔细分析下,其实这个题考查的是栈的后进先出。考察:在某一入栈顺序确定的情况下,某出栈顺序是否可能存在。
算法证明阶段,我们只需要固定入栈顺序,并匹配出栈元素确定出栈顺序,看到最后栈是否为空。
3、举例说明(分析该题的可能性):
如:1-2-3-4的入栈顺序:
1先入栈——>要求出栈顺序为4-1-3-2,故1不能出栈;
2继续入栈——>2不等于4,不能出栈;
3继续入栈——>3不等于4,不能出栈;
4继续入栈——>4==4,出栈;
继续判断,3不等于1,不能出栈,结束!
最后栈中还存在元素,3-2-1,不为空,所以返回No!
4、代码实现(java语言):
我们将以上判断过程用代码进行实现
package test;
import java.util.Scanner;
import java.util.Stack;
public class StackDemo {
public static void test(int[] arr){
Integer[] old = {1,2,3,4};
Stack<Integer> stack = new Stack<Integer>();
int arrIndex = 0;
for (int i = 0; i < old.length; i++) {
stack.push(old[i]);
while(!stack.isEmpty() && stack.peek() == arr[arrIndex]){
stack.pop();
arrIndex++;
}
}
if(stack.isEmpty()){
System.out.println("Yes");
}else{
System.out.println("No");
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
sc.close();
test(arr);
}
}
5、总结:
以上便是通过该笔试题对栈的性质进行了简单回顾,希望对大家有帮助!