我正在为国际象棋应用实施撤消和重做方法。
到目前为止,我只通过创建一个 Deque 的电路板状态来实现撤消方法,每次我采取行动时,我都说
boardStatesStack.addFirst()
然后当我想撤消一个动作时,我说
boardStatesStack.removeFirst()
这可以作为"后进先出"数据结构是撤消移动所需要的,因为您添加到双端队列的最后一个板状态是撤消时检索到的状态。
但是,我想使用相同的堆栈实现重做方法。我怎么能这样做?问题是,当我撤消时,我调用removeFirst,这会删除董事会状态,所以我不能重做,因为它不在那里。我知道我可以跟踪已删除的状态,但我希望只需使用一个双端队列即可实现此撤消和重做方法。
答案 0 :(得分:1)
如果你使用Stack,有一个pop()方法实际上删除并返回第一个元素,你可以简单地将该元素存储在某个地方(另一个列表)并在需要时再次访问它。
或者在Stack实现中创建此方法:
public Object pop() throws StackException{
if (!isEmpty()) {
Node temp = top;
top = top.getNext();
return temp.getItem();
} else {
throw new StackException("StackException on " + "pop: stack empty");
}
}
注意:上述方法是基于堆栈是动态实现的,因此已经存在Node类。如果您的实现不同,您可能需要更改它,但这并不困难。
答案 1 :(得分:0)
使用列表并将自己的偏移量保留在列表中,而不是使用队列。撤消时,向下移动偏移量,然后重做时向上移动偏移量。当然,如果用户在撤消后进行新的移动,则需要丢弃重做方面的任何移动。