如何僅用遞迴函式和棧操作逆序一個棧
本題來自程式設計師程式碼面試指南
題目
一個棧依次壓入1、2、3、4、5,那麼從棧頂到棧底分別為5、4、3、2、1。將這個棧轉置後,從棧頂到棧底為1、2、3、4、5,也就是實現棧中元素的逆序,但是隻能用遞迴函式來實現,不能用其他資料結構。
-
遞迴函式一:將棧stack的棧底元素返回並移除
-
遞迴函式二:逆序一個棧,就是題目要求實現的方法,具體過程就是如下程式碼中的reverse方法。
public class ReverseStack {
/**
* 將棧的棧底元素出棧返回
* @param stack
* @param <T>
* @return
*/
public static <T> T getAndRemoveLastElement(Stack<T> stack) {
//講一個值彈出棧
T result = stack.pop();
//棧空返回棧底元素
if (stack.isEmpty()) {
return result;
} else {
//在遞迴呼叫的過程中棧底元素始終保持在last裡
T last = getAndRemoveLastElement(stack);
//呼叫返回,將非棧底元素重新壓入棧中
stack.push(result);
return last;
}
}
/**
* 將棧逆序
* @param stack
* @param <T>
*/
public static <T> void reverse(Stack<T> stack) {
//遞迴呼叫的返回條件
if (stack.isEmpty()) {
return;
}
//返回棧中最後一個值
T andRemoveLastElement = getAndRemoveLastElement(stack);
reverse(stack);
stack.push(andRemoveLastElement);
}
}
遞迴看起來就像玄學,這個題在遞迴中套個遞迴,看上去就很有意思。
倆個遞迴分開看 ,第一個先將棧中元素彈出一個存到變數中,遞迴返回條件是彈出一個元素後棧空將棧底元素作為返回值返回,回到呼叫流程後將存在變數中的非棧底元素再次壓入棧中;第二個的返回條件是棧空,而第二個每一步彈出的是棧底元素,通過這個方法實現棧的逆序。
相關文章
- 僅用遞迴函式和棧操作逆序一個棧遞迴函式
- 【演算法】用遞迴顛倒一個棧演算法遞迴
- 棧Stack——遞迴替身?遞迴
- 棧實現遞迴遞迴
- 函式呼叫棧函式
- 用一個棧實現另一個棧的排序排序
- 漢諾塔非遞迴棧程式碼遞迴
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- 遞迴函式遞迴函式
- 包含min函式的棧函式
- 函式表示式–遞迴函式遞迴
- 怎樣用一個佇列和一個棧實現求一個表示式的值?佇列
- 函式的遞迴函式遞迴
- JavaScript 函式遞迴JavaScript函式遞迴
- php遞迴函式PHP遞迴函式
- 函式之遞迴函式遞迴
- Python自學之路:遞迴、棧和佇列遍歷目錄Python遞迴佇列
- 二叉樹建立後,如何使用遞迴和棧遍歷二叉樹?二叉樹遞迴
- 遞迴轉非遞迴 棧模擬 Recursive to Non-recursive stack simulated 總結遞迴
- C語言函式呼叫棧C語言函式
- 函式呼叫棧的問題函式
- 函式棧幀(呼叫過程)函式
- 函式遞迴與生成式函式遞迴
- 20201023_081.遞迴函式_函式呼叫記憶體分析_棧幀的建立遞迴函式記憶體
- 順序棧、鏈棧基本操作
- [譯]深入理解JavaScript函式執行—呼叫棧,事件迴圈和任務等JavaScript函式事件
- 遞迴函式的理解遞迴函式
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- 【譯】理解Javascript函式執行—呼叫棧、事件迴圈、任務等JavaScript函式事件
- 棧鏈式結構簡單操作
- Python 函式進階-遞迴函式Python函式遞迴
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- 使用棧實現表示式求值,運用棧計算
- 設計包含min函式的棧函式
- 1.5.6 python遞迴函式Python遞迴函式
- 13.0、python遞迴函式Python遞迴函式
- day 17 – 1 遞迴函式遞迴函式
- 遞迴函式例項大全遞迴函式