В том стеке, который на x86 организуется через регистры RSP/RBP, при помощи функции _alloca() вообще запросто создаются массивы с произвольным доступом . То есть по вашему на архитектуре x86 стека нет, а есть какой-то другой контайнер.
Так как этот стек не защищён от произвольного доступа, то формально да. Можно попытаться выкрутиться тем, что это стек не отдельных слов, а целых блока и что нет ни какой принципиальной разницы между не разрушающим чтением верхнего блока и парой стековых операций "прочитать вершину стека в a и сразу записать a снова на вершину стека" и эта пара просто оптимизирована, а доступ глубже блока, принадлежащего текущей подпрограмме, не выполняется. Но вот беда: разрушающее чтение реализовано как раз для слов, а все элементы стека ещё и должны быть однотипны. Так что формально это не стек, а похожий на него контейнер с двумя стековыми операциями и двумя операциями доступа, характерными для динамического массива. А чего вы ждёте от низкоуровневых контейнеров? Аппаратный стек x86-х хотябы максимально близок к истинному стеку из того, что на низком уровне вообще можно реализовать при возможности доступа к значению указателя на его вершину. Однако такой контейнер - явнейший union стека с массивом. Весь union стеком уже не является, но стек в него всё таки входит.
И вообще - зачем по-вашему нужен стек? Я всегда думал что для обхода графов. При посещении каждой вершины графа складываешь все ее ребра в стек, потом берешь первое ребро из стека, переходишь в смежную вершину и повторяешь до тех пор пока стек не пуст. Для графа имеющего циклы надо запоминать уже посещенные вершины чтобы избежать бесконечного цикла, для чего сгодится std::unordered_set. Каким-то образом раздельный top()/pop() может помешать реализации этого алгоритма? Я думаю - нет. Добавляется одна строчка.
Стек нужен для возврата из подпрограммы в произвольное место вызова, для вычисления значения математического выражения в постфиксной нотации и много ещё для чего. Да, сколько на него ни навешай лишней фигни, решить эти задачи она не помешает. Но это не повод звать стеком, например, дерево.
Стек (англ. stack — стопка; читается стэк) — абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).
,
В цифровом вычислительном комплексе стек называется магазином — по аналогии с магазином в огнестрельном оружии (стрельба начнётся с патрона, заряженного последним).
,
В 1946 Алан Тьюринг ввёл понятие стека[1]. А в 1957 году немцы Клаус Самельсон и Фридрих Л. Бауэр запатентовали идею Тьюринга[2].
Где здесь хоть слово о поздних искажениях всякими топами в stl, в котором и вектор во-первых попытались перепутать с динамическим массивом, а во-вторых имеет мало общего и с ним, и с какой бы то нибыло разновидностью вектора, как он опять таки до stl определён в метематике?
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.