如何仅用递归函数和栈操作逆序一个栈
Posted 猩生柯北
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何仅用递归函数和栈操作逆序一个栈相关的知识,希望对你有一定的参考价值。
【题目】
一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他的数据结构。
【解答】
首先分为两步。第一步,得到栈底元素并移除这个栈底元素;第二步,将得到的栈底元素逆序入栈。
【代码】
1 package cn.hl.p3; 2 3 import java.util.Stack; 4 5 /** 6 * title:一个栈依次压入1、2、3、4、5, 7 * 那么从栈顶到栈底分别为5、4、3、2、1。 8 * 将这个栈转置后,从栈顶到栈底为1、2、3、4、5, 9 * 也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他的数据结构。 10 * 11 * @author 猩生柯北 12 */ 13 14 public class suanfa { 15 /** 16 * 将栈stack的栈底元素返回并移除 17 * @param stack 18 * @return 19 */ 20 public static int getAndRemoveLastElement(Stack<Integer> stack){ 21 //弹出栈顶元素 22 int result = stack.pop(); 23 //判断 24 //弹出元素后如果栈为空,则返回该元素 25 if(stack.isEmpty()){ 26 return result; 27 }else{ 28 //不为空时,则递归。此时栈为原栈弹出栈顶元素后的一个变化的栈。 29 //当递归到栈底元素时,将栈顶元素返回并赋值给变量last 30 int last = getAndRemoveLastElement(stack); 31 //递归结束。将除栈底元素的其他元素按原先顺序依次入栈。 32 //此时的栈与原栈的区别是:栈底元素被移除 33 stack.push(result); 34 //返回原栈底元素 35 return last; 36 } 37 } 38 39 /** 40 * 逆序一个栈。 41 * @param stack 42 */ 43 public static void reverse(Stack<Integer> stack){ 44 //判断。 45 if(stack.isEmpty()){ 46 return; 47 } 48 //得到栈底元素 49 int i = getAndRemoveLastElement(stack); 50 //递归。此时的栈是原栈返回并移除栈底元素的一个变化栈。 51 reverse(stack); 52 //递归结束。递归到栈空时,将得到的栈底元素依次(注意顺序!!!)入栈。 53 stack.push(i); 54 } 55 56 //测试.入栈元素依次为:5,7,9. 57 public static void main(String[] args) { 58 Stack s1 = new Stack(); 59 s1.push(5); 60 s1.push(7); 61 s1.push(9); 62 System.out.println("The elements in the original stack:"); 63 for( int i=0 ; i <= s1.size()+1; i++ ){ 64 System.out.println(s1.pop()); 65 } 66 67 s1.push(5); 68 s1.push(7); 69 s1.push(9); 70 reverse(s1); 71 System.out.println("==================================="); 72 System.out.println("The elements in the changed stack:"); 73 for( int i=0 ; i <= s1.size()+1; i++ ){ 74 System.out.println(s1.pop()); 75 } 76 } 77 } 78
【运行结果】
以上是关于如何仅用递归函数和栈操作逆序一个栈的主要内容,如果未能解决你的问题,请参考以下文章