Если вы знаете хорошую верхнюю границу размера стека, использование массива (как описано в другом ответе) может быть разумным решением. Все шесть операций являются O (1), и, если стек часто работает около своего максимального размера, оптимальным является хранение на элемент.
С другой стороны, если вы не знаете верхнюю границу размера стека или если размер стека обычно будет небольшим по сравнению с верхней границей, используйте список с двойной связью, как описано ниже. Опять же, все шесть операций являются O (1). Хранение на элемент является оптимальным, если стек работает около минимального размера - у вас не будет большого пространства неиспользуемого массива. Обратите внимание, что выделение памяти, показанное ниже как «новые» и «свободные», может состоять из вызовов malloc () и free () или может быть некоторым распространенным методом ограничения накладных расходов с использованием пула доступных узлов.
Пусть H указывает на начало списка, T на хвост и M на середину. (M может поддерживаться во времени O (1) на изменение, как показано ниже.) Инициализируйте размер списка s = 0 и средний счет m = 0.
Для ваших операций 1-6:
Пустой толчок (E e):
Создайте новый узел X со значением e; ++ s; если (s == 1) установить H = T = M = X и установить ссылки, иначе {приложить X в H; установить H = X; если m <(s / 2 + 1), то {++ m и установите M = M.next}}. </p>
void pop (E e): если s <1, вернуть ноль или ошибку; else {получить значение e = He для возврата, установить H = H.next, отсоединить и освободить H.prev, --s, если (s == 0) H = T = M = null, если m> (s / 2 +1) затем {--m и установить M = M.prev}}.
E peekMidElement (); [size () / 2) +1]: если M, вернуть M.e, иначе null
E peekHighestElement (): если H, вернуть H.e (или T.e?), Иначе null
E peekLowestElement (): если T, вернуть T.e (или H.e?), Иначе null
int size (): Return s
Я не знаю, какой конец стека "Высокий"; Вы видите это как взросление или падение? В любом случае, просто исправьте ops 4 и 5, как хотите, и измените имена на peekHeadElement или peekFirstElement и т. Д.