Это сложная проблема, которую можно решить в общем случае - если бы это было легко, это было бы в библиотеке.
Одним из способов является то, чтобы каждое «Действие» было классом. Например, класс «Добавить текст» может добавить количество символов на экран в заданной позиции. Этот объект создается при вводе и помещается в стек после завершения (возможно, вам нужен один объект для каждого символа.
Хитрость в том, что каждое «Действие» также имеет метод отмены, который может отменить сам. Таким образом, повторяющиеся отмены становятся просто цепочкой actionStack.pop (). Undo ();
Таким образом, функция удаления будет знать, что она должна была удалить выбранный в данный момент текст. Он будет записывать позицию и текст, который был удален сам по себе и сидеть в стеке. Если бы вы назвали его отменой, он просто поместил бы текст обратно в документ.
Похоже, что вы пытаетесь что-то сделать в этом направлении, но не создаваете отдельный объект для каждого типа действия, которое может повлиять на документ (AddCharacter, Delete, EraseDocument, ...). Это выполнимо - это так, как если бы вы делали это не на языке OO, но это не просто и не чисто. Например, вам нужно будет хранить произвольные метаданные, такие как удаленный текст, позицию, из которой вы удалили и т. д. в какую-то часть вашего стека.
Когда вы разбиваете это на маленькие действия, это становится чрезвычайно забавным и легким ...