栈的实现<array<string, 100>>

Implementation of stack <array<string, 100>>

我已经学习 C++ 几个星期了,并开始制作我的游戏,我用 std::stack 解决了这个问题。

我有一个 class 有一个板子和一个堆栈

#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();

此 return 是堆栈顶部的 当前 元素。这不是 return 前元素。这是古老的历史。

所以,最后:如果在这次冒险开始时堆栈只有一个元素,首先将其删除,然后尝试在完全空的堆栈顶部检索该元素。这当然不存在,整个纸牌屋都倒塌了。

你这两个操作是乱序的。 首先需要取栈top处的元素;只有 then,在元素安全地隐藏在您自己的变量中之后,您才能到达 pop 堆栈。