嘿,我是C ++的初学者,我想向C ++的Undo
类中添加linkedList
函数,该函数会反转列表上的最后一个操作,例如({{1 }},append
,insertAt
,deleteAt
)),关于撤消这些命令的最佳方法的想法是什么?
答案 0 :(得分:0)
我可以想到两种简单的方法来实现“撤消”的魔力:将更改保持在队列中,直到您真正必须将其推入为止;或者对每个更改进行反向操作,以将它们放入撤消队列。
第一个看起来像这样:
User Action | Action Queue | actual list
---------------------------------------
nothing | empty | {}
push 5 | {push 5} | {}
push 2 | {push 2, push 5} | {}
print list | {} | {5, 2}
仅当用户执行需要对更改进行渗透(例如打印或获取)的操作时,才真正进行更改。然后撤消操作只会从操作队列中弹出。
另一种选择是存储反向队列:
User Action | Reverse Queue | actual list
---------------------------------------
nothing | empty | {}
push 5 | {pop} | {5}
push 2 | {pop, pop} | {5, 2}
pop | {push 2, pop, pop} | {5}
undo | {pop, pop} | {5, 2}
在这里,用户所做的任何事情都会立即被过滤掉,然后您将操作的反向推入反向队列。然后,撤消“反向”队列并执行操作。
虽然第一个方法更容易实现,但它意味着您在“更改被推送”之后便失去了撤消功能。