Für eine saubere Undo/Redo-Implementierung brauchst du zwei Stacks: einen für die Undo- und einen für die Redo-Operation.
Das sehe ich auch so.
Ausserdem sollte man die ganze Undo/Redo-Logik in eine
eigene Klasse (den "Undo/Redo-Manager") auslagern.
Damit wären es dann 3 Objekte.
Nur so bekommt man eine Lösung, die nicht Spaghetticode erinnert.