仅使用递归函数和栈操作,实现栈中元素的逆序排列

 

题目:

        一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、 3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实 现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。

解决方案:

      思路:

      利用递归调用栈的特性,通过两个递归函数协作:

  1. 移除并返回栈底元素:通过递归弹出栈顶元素,直到栈底元素被弹出,然后将非栈底元素重新压回栈中。

  2. 递归逆序栈:反复移除栈底元素并递归逆序剩余栈,最后将移除的栈底元素压回栈顶(此时栈已逆序,压入的元素成为新栈顶)。

代码实现:

import java.util.Stack;

public class StackReverser {
    // 递归函数1:移除并返回栈底元素
    private static int getAndRemoveLastElement(Stack<Integer> stack) {
        int top = stack.pop(); // 弹出栈顶元素
        if (stack.isEmpty()) {
            return top; // 栈空时,top即为栈底元素
        } else {
            int last = getAndRemoveLastElement(stack); // 递归获取栈底元素
            stack.push(top); // 将非栈底元素重新压回栈中
            return last;
        }
    }

    // 递归函数2:逆序栈
    public static void reverseStack(Stack<Integer> stack) {
        if (stack.isEmpty()) {
            return; // 递归终止条件:栈空
        }
        int last = getAndRemoveLastElement(stack); // 获取栈底元素
        reverseStack(stack); // 递归逆序剩余栈
        stack.push(last); // 将原栈底元素压入栈顶
    }

    // 测试代码
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        // 压入元素:1->2->3->4->5(栈顶到栈底:5,4,3,2,1)
        for (int i = 1; i <= 5; i++) {
            stack.push(i);
        }
        System.out.println("原始栈(栈顶->栈底): " + stack); // 输出:[5,4,3,2,1]

        reverseStack(stack); // 逆序栈
        
        System.out.println("逆序后(栈顶->栈底): " + stack); // 输出:[1,2,3,4,5]
    }
}

代码解析:
  1. getAndRemoveLastElement函数

    • 弹出栈顶元素 top

    • 递归调用自身,直到栈为空(此时返回的 top 即栈底元素)。

    • 递归返回时,将非栈底元素重新压栈,保持栈中除栈底外的元素顺序不变。

  2. reverseStack函数

    • 递归移除栈底元素 last,并继续逆序剩余栈。

    • 当栈为空时开始返回,将 last 压入栈顶。

    • 最终实现栈底元素成为新栈顶,完成逆序。

  3. 测试流程

    • 初始化栈:压入 1->2->3->4->5(栈顶到栈底为 5,4,3,2,1)。

    • 调用 reverseStack 后,栈顶到栈底变为 1,2,3,4,5

小结:

  • 时间复杂度: O(n²)(每个元素需递归 n 层,共 n 个元素)

  • 空间复杂度: O(n)(递归调用栈深度为 n)

  • 递归的深度=栈的大小:当栈元素过多时,可能引发 StackOverflowError

  • 逆序的实质:通过递归将栈底元素移至栈顶,重复此过程直至栈完全逆序。

  • 后序压栈:在递归返回阶段压栈,确保原栈底元素最后压入(成为新栈顶)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空中楼阁,梦幻泡影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值