撤消对链接列表类的功能

时间:2018-11-09 17:11:49

标签: c++ linked-list stack undo

嘿,我是C ++的初学者,我想向C ++的Undo类中添加linkedList函数,该函数会反转列表上的最后一个操作,例如({{1 }},appendinsertAtdeleteAt)),关于撤消这些命令的最佳方法的想法是什么?

1 个答案:

答案 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}

在这里,用户所做的任何事情都会立即被过滤掉,然后您将操作的反向推入反向队列。然后,撤消“反向”队列并执行操作。

虽然第一个方法更容易实现,但它意味着您在“更改被推送”之后便失去了撤消功能。