Используйте двусвязный список. Когда пользователи используют отмены / повторы, они могут индексировать состояние несколько раз (например, сделать 4 отмены, а затем понять, что они зашли слишком далеко и выполнить повтор). Один стек или очередь не будут поддерживать это.
Два стека будут поддерживать отмену и повтор, но я думаю, что их использование - пустая трата времени. Все повторные сувениры будут удалены, как только пользователь выполнит редактирование (которое создаст новый сувенир). Таким образом, в большинстве случаев приложение не будет напоминать «повторить».
Предполагая, что у вас есть сборка мусора, так как вы пометили его .net:
Когда пользователь выполняет редактирование, все, что вам нужно будет сделать с двусвязным списком, - установить ссылку на заголовок связанного списка на текущий сувенир. Если вы используете стек, то вам придется либо создать новый стек, либо вытолкнуть все из него, чтобы gc освободил повторные сувениры.