首页 > 解决方案 > 对链表类撤消功能

问题描述

嘿,我是 C++ 的初学者,我想在 C++Undo的类中添加一个函数linkedList,该函数反转列表上完成的最后一个操作,例如 ( append, insertAt, deleteAt, clear) , 关于什么是最好的方法的任何想法撤消这些命令?

标签: c++linked-liststackundo

解决方案


我可以想到两种简单的方法来完成“撤消”的魔力:将更改保存在队列中,直到您确实必须推送它们,或者将反向操作推送到您所做的每个更改到撤消队列中。

第一个看起来像这样:

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}

在这里,用户所做的任何事情都会立即渗透,并且您将操作的反向推送到反向队列中。然后撤消是弹出反向队列并采取行动。

虽然第一个更容易实现,但这意味着您在“推送更改”后无法撤消。


推荐阅读