Эй, я новичок в C ++, и я хочу добавить Undo
функция к linkedList
класс в C ++, функция отменяет последнюю операцию, выполненную в списке, такую как (append
, insertAt
, deleteAt
, clear
) Есть идеи о том, как лучше всего отменить эти команды?
Я могу придумать два простых способа реализовать магию «отмены»: удерживая изменения в очереди до тех пор, пока вам действительно не придется их нажимать, или нажимая обратную операцию для каждого изменения, которое вы вносите в очередь отмены.
Первый будет выглядеть так:
User Action | Action Queue | actual list
---------------------------------------
nothing | empty | {}
push 5 | {push 5} | {}
push 2 | {push 2, push 5} | {}
print list | {} | {5, 2}
Только когда пользователь выполняет действие, в котором вам необходимо внести изменения (например, распечатать или получить), вы действительно вносите изменения. Тогда отмена будет просто всплывающей из очереди действий.
Другой вариант будет хранить обратную очередь:
User Action | Reverse Queue | actual list
---------------------------------------
nothing | empty | {}
push 5 | {pop} | {5}
push 2 | {pop, pop} | {5, 2}
pop | {push 2, pop, pop} | {5}
undo | {pop, pop} | {5, 2}
Здесь все, что пользователь делает, немедленно перколируется, и вы помещаете реверс действия в очередь реверса. Затем отменить нужно выскочить из очереди реверса и выполнить действие.
Хотя первый способ гораздо проще реализовать, это означает, что вы теряете возможность отмены после «внесения изменений».
Других решений пока нет …