Java游戏开发:如何将弹出的栈元素重新压入且避免无限循环?
解决Java游戏中栈操作的无限循环问题
你遇到的问题根源很明确:在同一个循环里对同一个栈同时执行pop()和push(),栈永远不会被清空,必然陷入无限循环。要实现“还原棋盘后将操作重新压回原栈”的需求,需要借助临时容器中转操作,具体步骤如下:
- 先将原栈中的所有操作弹出,存入临时容器,同时完成棋盘的还原
- 再将临时容器里的操作逐个压回原栈
方案一:用临时栈中转
// 第一步:弹出原栈操作、还原棋盘并存入临时栈 Stack<UserMove> tempStack = new Stack<>(); while (!history.isEmpty()) { UserMove userMove = history.pop(); // 把操作还原到棋盘 assignUserMoveToBoard(userMove); tempStack.push(userMove); } // 第二步:将临时栈的操作压回原栈 while (!tempStack.isEmpty()) { history.push(tempStack.pop()); }
方案二:用List中转(保持原顺序更直观)
如果担心栈的顺序反转问题,用List存储后反向遍历压栈,能更清晰地保持原操作顺序:
List<UserMove> tempList = new ArrayList<>(); while (!history.isEmpty()) { UserMove userMove = history.pop(); assignUserMoveToBoard(userMove); tempList.add(userMove); } // 反向遍历List,按原顺序将操作压回原栈 for (int i = tempList.size() - 1; i >= 0; i--) { history.push(tempList.get(i)); }
两种方案都能完成“还原棋盘+恢复栈内容”的需求,且不会出现无限循环。
内容的提问来源于stack exchange,提问作者V172456443
相关产品推荐
相关产品推荐

