You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pop()方法实现栈的逆序并打印?Java自定义栈反转求助

栈完全逆序功能实现方案

原有错误代码问题说明

你提供的错误实现存在以下问题:

  • 硬编码固定次数的pop/push操作,仅能处理3个元素的场景,不具备通用性
  • 调用了原Stack类不存在的topEl()方法,原类获取栈顶元素的方法为peek()
  • 代码中出现了未定义的变量stack,实际应为传入的参数stack1
  • 判空方法名拼写错误,原类方法为isempty()而非isEmpty()
  • 没有遍历所有栈元素的通用逻辑,仅做了固定几步操作无法实现全栈逆序

实现方案:新增StackReverser工具类

我们通过新增独立的工具类实现栈反转,完全不需要修改原有Stack类的代码,符合开闭原则。以下提供两种稳定实现:

方案1:递归实现(推荐,完全基于原类公开方法)

该方案仅依赖原Stack类提供的公开push、pop、isempty方法,不访问类内部成员,兼容性更强:

public class StackReverser {
    // 对外暴露的栈反转方法
    public static void reverse(Stack targetStack) {
        if (targetStack.isempty()) {
            return;
        }
        // 取出当前栈顶元素
        Pos topElement = targetStack.pop();
        // 递归反转剩余的栈结构
        reverse(targetStack);
        // 将之前取出的栈顶元素插入到当前栈的底部
        insertAtBottom(targetStack, topElement);
    }

    // 私有辅助方法:将指定元素插入到栈底
    private static void insertAtBottom(Stack stack, Pos element) {
        if (stack.isempty()) {
            stack.push(element);
            return;
        }
        Pos temp = stack.pop();
        insertAtBottom(stack, element);
        stack.push(temp);
    }
}

方案2:辅助栈实现(性能更高,需同包访问权限)

如果你的工具类和原Stack类在同一个包下,可以用这种时间复杂度O(n)的实现,性能更优:

public class StackReverser {
    public static void reverse(Stack targetStack) {
        // 边界处理:空栈或仅1个元素无需反转
        if (targetStack.isempty() || targetStack.top == 1) {
            return;
        }
        // 创建和原栈大小一致的临时栈
        Stack tempStack = new Stack(targetStack.top);
        // 将原栈所有元素弹出压入临时栈
        while (!targetStack.isempty()) {
            tempStack.push(targetStack.pop());
        }
        // 替换原栈的存储数组和栈顶指针
        targetStack.st = tempStack.st;
        targetStack.top = tempStack.top;
    }
}

使用示例

直接调用工具类的reverse方法即可完成栈反转,测试代码如下:

public class StackReverseTest {
    public static void main(String[] args) {
        Stack mazePath = new Stack();
        // 压入迷宫路径,栈底到栈顶顺序:(1,1) → (1,2) → (2,2) → (2,3)
        mazePath.push(1,1);
        mazePath.push(1,2);
        mazePath.push(2,2);
        mazePath.push(2,3);

        // 执行栈反转
        StackReverser.reverse(mazePath);

        // 弹出验证:反转后栈顶到栈底顺序为 (1,1) → (1,2) → (2,2) → (2,3)
        while (!mazePath.isempty()) {
            Pos pos = mazePath.pop();
            System.out.printf("(%d,%d)%n", pos.row, pos.col);
        }
    }
}

内容的提问来源于stack exchange,提问作者BlueyedGabbar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:54:03