Я хочу реализовать опции UNDO и REDO (как мы видим в MS-слове и т.д.). Можете ли вы предложить мне структуру данных для него и как я могу ее реализовать?
Структура данных, используемая для реализации варианта UNDO и REDO
Ответ 1
Это не структура данных, а шаблон проектирования. Вы ищете Command Pattern.
Стандартом является сохранение объектов Command в стеке для поддержки отмены нескольких уровней. Чтобы поддерживать повтор, второй стек сохраняет все команды, которые вы отменили. Поэтому, когда вы выталкиваете стопку отмены, чтобы отменить команду, вы нажимаете ту же команду, которую вы выталкивали в стек повтора. Вы делаете то же самое в обратном порядке при повторном выполнении команды. Вы набираете стек повтора и выталкиваете выталкиваемую команду обратно в стек отмены.
Ответ 2
На самом деле стандартный шаблон для этой функции (Gang of Four, even) Memento.
Кроме того, в то время как в большинстве программ используются стопы Undo/Redo, afficionados некоторых текстовых редакторов предпочитают деревья Undo/Redo, чтобы они не теряли всю свою историю, если они отменяют несколько команд, пытаются создать новую и передумают.
Ответ 3
Objective-C Cocoa имеет хорошо документированный anwser с именем NSUndoManager.
Ответ 4
Вы можете использовать Command Pattern для достижения Undo/Redo
Проверьте эти образцы:
Ответ 5
Это классический случай Command Pattern. Ниже приведен пример реализации функции отмены в Python:
from os import rename
class RenameFileCommand(object):
def __init__(self, src_file, target_file):
self.src_file=src_file
self.target_file=target_file
def execute(self):
rename(self.src_file, self.target_file)
def undo(self):
rename(self.target_file,self.src_file)
class History(object):
def __init__(self):
self.commands=list()
def execute(self, command):
command.execute()
self.commands.append(command)
def undo(self):
self.commands.pop().undo()
if __name__=='__main__':
hist=History()
hist.execute(RenameFileCommand( 'test1.txt', 'tmp.txt', ))
hist.undo()
hist.execute(RenameFileCommand( 'tmp2.txt', 'test2.txt',))