笔试题之——栈问题(列车车厢编组问题)

滴!又是一个笔试题总结!

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、总结:

以上便是通过该笔试题对栈的性质进行了简单回顾,希望对大家有帮助!

猜你喜欢

转载自blog.csdn.net/fhy569039351/article/details/83006369
今日推荐