17. Черновик с Undo/Redo — повышенный уровень
Стек Stack<T>
Что хранит. Хранит элементы как стопку. Первым извлекается последний добавленный элемент: LIFO.
Для чего используют. Подходит для возврата к предыдущему экрану, отмены изменений и хранения истории состояний.
Основные операции
| Запись на C# | Назначение |
s.Push(x) | Положить x на вершину. |
s.Pop() | Вернуть и удалить верхний элемент. |
s.Peek() | Прочитать вершину без удаления. |
s.Count | Число элементов. |
s.Clear() | Удалить все элементы. |
s.ToArray() | Получить массив от вершины к основанию стека. |
Пример
Для примера нужны using System; и using System.Collections.Generic;. Код выполняется внутри Main.
Stack<int> history = new Stack<int>();
history.Push(10);
history.Push(20);
Console.WriteLine(history.Peek());
Console.WriteLine(history.Pop());
Console.WriteLine(history.Peek());
Вывод:
20
20
10
Важно. Перед Peek и Pop проверьте Count > 0. Для отмены сохраняют данные предыдущего состояния. Обычный перебор стека идёт от последнего добавленного элемента к первому.
Для этой задачи
- Два стека. Один хранит текущие строки, второй — отменённые. UNDO и REDO перемещают элементы между ними.
- Новое действие. Новое APPEND очищает стек отменённых строк через Clear.
- Вывод текста. ToArray возвращает строки от последней к первой; для обычного порядка обходите массив с конца.
Черновик состоит из последовательности строк и изначально пуст. Для простоты каждая строка содержит одно слово без пробелов. APPEND добавляет строку в конец. UNDO отменяет последнее неотменённое добавление. REDO возвращает последнее отменённое добавление. Новая команда APPEND после отмены полностью очищает возможность повторения старых отменённых добавлений.
Команды
| Команда | Действие и ответ |
APPEND word | Добавить строку, очистить историю REDO: OK. |
UNDO | Отменить добавление: OK; если нечего отменять: EMPTY. |
REDO | Повторить отменённое добавление: OK; если нечего повторять: EMPTY. |
PRINT | Вывести слова черновика или EMPTY. |
COUNT | Вывести число строк в черновике. |
Входные данные
Первая строка содержит q. Далее идут q команд, по одной в строке. Одинаковые слова могут встречаться в разных строках.
Выходные данные
Для каждой команды выведите ответ из таблицы. PRINT выводит слова черновика в порядке строк через один пробел. Неуспешные UNDO и REDO, а также PRINT и COUNT, не меняют ни черновик, ни историю.
Не выводите приглашения к вводу и пояснения. Служебные слова в ответах пишите в указанном регистре.
Ограничения
1 ≤ q ≤ 100000; слово содержит 1–20 строчных латинских букв. Суммарное количество слов во всех ответах PRINT не превышает 200000.
| № | Входные данные | Выходные данные |
|
1
|
10
APPEND alpha
APPEND beta
UNDO
PRINT
REDO
PRINT
UNDO
APPEND gamma
REDO
PRINT
|
OK
OK
OK
alpha
OK
alpha beta
OK
OK
EMPTY
alpha gamma
|
|
2
|
8
UNDO
REDO
APPEND x
UNDO
COUNT
REDO
PRINT
COUNT
|
EMPTY
EMPTY
OK
OK
0
OK
x
1
|
Напишите программу
Auto