Data structures 什么';(撤消重做)的最佳数据结构是什么?

Data structures 什么';(撤消重做)的最佳数据结构是什么?,data-structures,stack,Data Structures,Stack,对于Undo/Redo,(ctrl+z,ctrl+y),最好的数据结构是什么? 几天前,我们的老师说堆栈是最好的撤销方法,但我在考虑双链接列表 是否有其他数据结构可以更好地实现我们的目标?还是这两个中的一个引导着我们的目标&哪一个? PS:如果有更好的数据结构,请使用(oop)-首选java-&感谢您的帮助从原理上讲,撤消/重做是基于堆栈(先进先出)的操作,因此您需要某种基于堆栈的体系结构来存储操作 话虽如此,堆栈行为的方式可能会因应用程序的其他需求而有所不同。通常的方法是用数组作为堆栈的后盾—

对于
Undo/Redo
,(ctrl+z,ctrl+y),最好的数据结构是什么? 几天前,我们的老师说堆栈是最好的撤销方法,但我在考虑双链接列表

是否有其他数据结构可以更好地实现我们的目标?还是这两个中的一个引导着我们的目标&哪一个? PS:如果有更好的数据结构,请使用(oop)-首选java-&感谢您的帮助

从原理上讲,撤消/重做是基于堆栈(先进先出)的操作,因此您需要某种基于堆栈的体系结构来存储操作

话虽如此,堆栈行为的方式可能会因应用程序的其他需求而有所不同。通常的方法是用数组作为堆栈的后盾——保持最后一个元素的当前索引,并在该索引处添加(删除)新的stuff元素,并相应地增加(减少)ot

但您也可以以不同的方式实现这种先进先出的行为,例如,双链接列表-您将保留对列表最后一个元素的引用,并在末尾添加新元素(并更新此引用)或删除最后一个元素(并更新对新最后一个元素的引用)。给自己一堆的行为

编辑:

对于重做,您保留单独的堆栈,在其中每当撤消命令时都会推送命令,以便以后可以使用(从重做堆栈弹出、执行、推送到撤消堆栈)
当您将new(例如,不是从redo stack)命令推送到undo stack时,清除redo stack非常重要。请将所有操作放入一个堆栈中,以便进行多级undo。在重做的情况下,创建另一个堆栈。此堆栈将保留您已撤消的所有命令。因此,当您执行撤消命令时,您将弹出撤消堆栈并将该操作推入重做堆栈。在重做中执行相同的操作。当您弹出重做操作时,将其放入撤消堆栈