ich weiß nicht, wie es speziell in deinem Fall ist, aber ich protokolliere immer alles, was der User machen kann, wenn ich ne Art Undo-Funktion brauche.
Ich nehme dafür einen Vector und speicher immer die letzte Anderung ab. Ein Undo geht dann ganz einfach, in dem ich den letzten Schritt rückwärts mache. Problematisch bei so einem Vector kann werden, dass dieser quasi unednlich groß werden kann. Aber da kann man ja Länge abfragen und das erste Element wieder löschen, wenn er die maximalgröße erreicht hat. Ich finds ganz geschickt. Klappt auch ganz gut. Vielleicht gehts in deinem Fall aber auch einfacher...