嘿,我是C++的初学者,我想在C++中的linkedList
类中添加一个Undo
函数,该函数会反转列表上的最后一个操作,例如(append
、insertAt
、deleteAt
、clear
(。关于撤消这些命令的最佳方法是什么,有什么想法吗?
我可以想出两种简单的方法来实现"撤消"的魔力:将更改保存在队列中,直到你真的必须推送它们,或者将对你所做的每个更改的反向操作推送到撤消队列中。
第一个看起来是这样的:
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}
在这里,用户所做的任何事情都会立即渗透,并将操作的反向推送到反向队列中。然后,撤消操作将弹出反向队列并执行操作。
虽然第一个更容易实现,但这意味着在"推动更改"之后,您将失去撤消的能力