问题描述
我已经学习 C++ 几个星期了,并开始制作我的游戏,我用 std::stack 解决了这个问题。
#include <string>
#include <stack>
array<string,100> board;
stack<array<string,100>> history;
每次我创建我的板或进行更改时,我只需通过 history.push(board)
将其推入堆栈。
我做了一个如下所示的撤销功能:
array<string,100> Board::undoMove(stack<array<string,100>> &history){
array<string,100> arr;
if(!history.empty()){
history.pop();
arr = history.top();
}
else{
arr = array<string,100>();
}
return arr;
}
调用时:
array<string,100> tempState = b.undoMove(history);
if(!tempState.empty()){
board = tempState;
cout << "\nUndoing your latest move.. "<< endl;
}
else{
cout << "No prevIoUs move available" << endl;
}
显然,只有当我在第一次更改电路板后进行撤消操作时,此功能才有效。经过几次更改后,我的程序在暂停后停止。
我不太擅长调试,所以我无法弄清楚哪里出了问题。我正在制作这个游戏,所以它帮助我了解堆栈是如何工作的,但我认为这不会发生!我认为我认为堆栈在这种情况下应该如何工作有问题。
此外,有些人建议堆栈是一堆 std::array
的事实在我推送时会产生问题,但这听起来不对,所以我很困惑我应该如何看待这个问题或想到它,我正在寻找我能得到的任何建议。
解决方法
history.pop();
这将删除堆栈顶部的元素。如:它消失了。它不再是。它去见它的制造者。它加入了隐形合唱团。它渴望峡湾。它现在是一个前元素。之后:
arr = history.top();
这将返回堆栈顶部的 current 元素。这不会返回 ex 元素。这是古老的历史。
所以,最后:如果在这次冒险开始时堆栈只有一个元素,首先将其移除,然后尝试检索完全空堆栈顶部的元素。这当然是不存在的,整个纸牌屋都倒塌了。
你不按顺序执行了这两个操作。 首先您需要检索堆栈top
处的元素;并且只有然后,在元素安全地隐藏在您自己的变量中之后,您就可以进入pop
堆栈。