1. 程式人生 > 其它 >如何僅用遞迴函式和棧操作逆序一個棧 & 貓狗佇列

如何僅用遞迴函式和棧操作逆序一個棧 & 貓狗佇列

如何僅用遞迴函式和棧操作逆序一個棧

題目:如何僅用遞迴函式和棧操作逆序一個棧

《程式設計師程式碼面試指南》第3題 P7 難度:尉★★☆☆

該題比較奇怪,也可能我理解錯誤,我做的思路是用一個遞迴函式和另一個棧,從棧頂先pop()再放入空棧,再遞迴取下一個(完全是莫名其妙,不過我也實在想不出來只用遞迴的解法)。

看了解答後,沒想到要用到兩個遞迴函式,一個用來返回棧底元素並移除,另一個用來逆序棧(該遞迴函式中還呼叫第一個遞迴函式)。

具體的原理及原理圖見書P7-8頁。

自己的程式碼就不貼了,做的也不對。下面是牛客網上的解答

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.util.Stack;
 5 
 6 public class Main{
 7     public static void main(String[] args) throws IOException {
 8         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 9         int n = Integer.parseInt(reader.readLine());
10         String[] str = reader.readLine().split(" ");
11         reader.close();
12         Stack<Integer> stack = new Stack<>();
13         for (int i = n - 1; i >= 0; i--) {
14             stack.push(Integer.parseInt(str[i]));
15         }
16         reverse(stack);
17         StringBuilder sb = new StringBuilder();
18         while(!stack.isEmpty()){
19             sb.append(stack.pop()).append(" ");
20         }
21         System.out.println(sb);
22     }
23     private static int getAndRemoveLastElement(Stack<Integer> stack) {
24         int result = stack.pop();
25         if (stack.isEmpty()) {
26             return result;
27         } else {
28             int last = getAndRemoveLastElement(stack);
29             stack.push(result);
30             return last;
31         }
32     }
33     private static void reverse(Stack<Integer> stack) {
34         if (stack.isEmpty()) {
35             return;
36         }
37         int i = getAndRemoveLastElement(stack);
38         reverse(stack);
39         stack.push(i);
40     }
41 }

貓狗佇列

題目:貓狗佇列

《程式設計師程式碼面試指南》第4題 P9 難度:士★☆☆☆

該題沒什麼技術含量,程式碼量還大,不做過多贅述。

我自己的思路和題解的思路差別就在於,我只用了一個總的佇列來儲存貓和狗,而題解則分了貓佇列和狗佇列,並且對貓和狗作進一步封裝,加上時間戳count),通過時間戳來區分貓和狗加入佇列的先後順序。核心在於pollAll(),通過判斷count來選擇輸出貓還是狗。

此外,我一開始每一步操作都直接sout輸出結果。然後提交執行後發現,執行超時了。看了討論區後才發現:

表示真的學到了,以後頻繁輸出的時候可以先全部存到StringBuilder裡,最後一次性輸出。

(注意:每次append()方法一定要加換行

,不然最後輸出就是連在一起的一行)

具體程式碼見貓狗佇列題解