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
       

time 3000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам