左神算法:用递归函数和栈逆序一个栈(Java版)
生活随笔
收集整理的這篇文章主要介紹了
左神算法:用递归函数和栈逆序一个栈(Java版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
一個棧依次壓入1,2,3,4,5,那么從棧頂到棧底分別為5,4,3,2,1。將這個棧轉置后,從棧頂到棧底為1,2,3,4,5,也就是實現棧中元素的逆序,但是只能用遞歸函數來實現,不能用其他數據結構。
題解
題源:《程序員代碼面試指南》
import java.util.Scanner; import java.util.Stack;public class Main {public static void main(String[] args) {// 輸入Scanner sc = new Scanner(System.in);int total = sc.nextInt();Stack<Integer> stack = new Stack<>();for (int i = 0; i < total; i++) {stack.push(sc.nextInt());}// 翻轉reverse(stack);// 輸出(翻轉后的棧無法直接從棧底輸出,為了達到效果,借助另一個棧輸出)Stack<Integer> out = new Stack<>();for (int i = 0; i < total; i++) {out.push(stack.pop());}for (int i = 0; i < total; i++) {System.out.print(out.pop() + " ");}}/*** 遞歸獲取并刪除棧底元素*/public static int getAndRemoveLast(Stack<Integer> stack) {int res = stack.pop();if (stack.isEmpty()) {return res;} else {int last = getAndRemoveLast(stack);stack.push(res);return last;}}/*** 遞歸實現棧的翻轉*/public static void reverse(Stack<Integer> stack) {if (stack.isEmpty()) return;int i = getAndRemoveLast(stack); // 獲取并刪除棧底元素reverse(stack);stack.push(i); // 將原有棧底元素重新壓入翻轉之后的棧} }附:書上配套代碼
package chapter_1_stackandqueue;import java.util.Stack;public class Problem_03_ReverseStackUsingRecursive {public static void reverse(Stack<Integer> stack) {if (stack.isEmpty()) {return;}int i = getAndRemoveLastElement(stack);reverse(stack);stack.push(i);}public static int getAndRemoveLastElement(Stack<Integer> stack) {int result = stack.pop();if (stack.isEmpty()) {return result;} else {int last = getAndRemoveLastElement(stack);stack.push(result);return last;}}public static void main(String[] args) {Stack<Integer> test = new Stack<Integer>();test.push(1);test.push(2);test.push(3);test.push(4);test.push(5);reverse(test);while (!test.isEmpty()) {System.out.println(test.pop());}}}總結
以上是生活随笔為你收集整理的左神算法:用递归函数和栈逆序一个栈(Java版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试必会系列 - 1.7 JVM 内存模
- 下一篇: 左神算法:猫狗队列(通过给不同实例盖时间