如何使用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
相关产品推荐
相关产品推荐

