1. 程式人生 > >筆試題之——棧問題(列車車廂編組問題)

筆試題之——棧問題(列車車廂編組問題)

滴!又是一個筆試題總結!

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、總結:

以上便是通過該筆試題對棧的性質進行了簡單回顧,希望對大家有幫助!