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

问题描述

我已经学习 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堆栈。