筆試題之——棧問題(列車車廂編組問題)
阿新 • • 發佈:2018-11-17
滴!又是一個筆試題總結!
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、總結:
以上便是通過該筆試題對棧的性質進行了簡單回顧,希望對大家有幫助!