Два стека могут быть эффективно реализованы с использованием одного массива фиксированного размера: стек № 1 начинается с левого конца и увеличивается вправо, а стек № 2 начинается с правого конца и увеличивается влево. Возможно ли то же самое для трех стеков?
Более конкретно, возможно ли реализовать три стека при следующих условиях:
- У вас есть массив фиксированного размера, который может содержать N объектов.
- Пока сумма трех размеров стека <N, push () не должна завершиться ошибкой.
- Операции push () и pop () должны занимать O (1) времени.
- В дополнение к массиву вы можете использовать только O (1) дополнительное пространство.
Вот примеры решений, которые не удовлетворяют этим требованиям:
- Разбиение массива на 3 фиксированные части и использование каждой части для стека (нарушает 2).
- Аналогично вышеописанному, но с подвижными границами между стопками (нарушает 3).
- Простые реализации на основе связанного списка (нарушает 4).
Я приму нетривиальные алгоритмы или доказательства невозможности, даже если они точно не удовлетворяют всем условиям (1) - (4), например, алгоритм, где push / pop берет O (1) амортизированное время, или где дополнительная память меньше, чем O (N), например, O (log N). Или доказательство невозможности, которое показывает, что, например, доступ менее чем к 5 элементам массива за push / pop невозможен.