structure de données utilisée pour implémenter l’option UNDO et REDO

Je veux implémenter l’option UNDO et REDO (comme on le voit dans MS word, etc.). Pouvez-vous me proposer une structure de données et comment puis-je la mettre en œuvre?

Ce n’est pas une structure de données mais un modèle de conception. Vous recherchez le modèle de commande .

La norme consiste à conserver les objects de commande dans une stack pour prendre en charge l’annulation de plusieurs niveaux. Pour prendre en charge le rétablissement, une deuxième stack conserve toutes les commandes que vous avez annulées. Ainsi, lorsque vous annulez la stack d’annulation pour annuler une commande, vous poussez la même commande que vous avez insérée dans la stack de restauration. Vous faites la même chose en sens inverse lorsque vous recommencez une commande. Vous ouvrez la stack de restauration et repoussez la commande éclatée dans la stack d’annulation.

En fait, le modèle standard pour cette fonctionnalité (Gang of Four, même) est Memento .

En outre, alors que la plupart des programmes utilisent les stacks Annuler / Rétablir, les utilisateurs de certains éditeurs de texte préfèrent les arbres Annuler / Rétablir afin qu’ils ne perdent pas leur historique s’ils annulent quelques commandes, en essayent une nouvelle et changent d’avis.

Objective-C Cocoa a une réponse bien documentée appelée NSUndoManager .

Vous pouvez utiliser le modèle de commande pour exécuter Annuler / Rétablir

Vérifiez ces échantillons:

http://www.codeproject.com/csharp/undoredobuffer.asp

http://www.dofactory.com/Patterns/PatternCommand.aspx

Ceci est un cas classique du modèle de commande. Voici un exemple d’implémentation de la fonctionnalité d’annulation dans 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',))