Очередь и одосвязный список

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

В том стеке, который на 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.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Теперь предоставь ссылку от себя, где сказано, что стек может быть организован исключительно через "разрушающее чтение" и никак иначе.
Я что-то такое видел в FORTH и JVM. Там все опкоды берут операнды со стека, и взамен кладут результат. Операции типа peek там нет, вместо нее используется dup. На x86 тоже теоретически возможно реализовать нечто подобное если отказаться от указателя фрейма. В таком случае освободится дополнительный регистр общего назначения - RBP, но исчезнет куча интересных возможностей типа ранее уже упомянутой функции _alloca(). Не знаю, можно ли компилировать программы на С++ с такой моделью памяти. C99 - точно нельзя, так как там есть локальные массивы переменного размера, которые реализованы как обертка над _alloca().
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Absurd писал(а):Я что-то такое видел в FORTH
Вот там классический стек и есть. Без навешанного на него чужого интерфейса.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Где здесь хоть слово о поздних искажениях всякими топами в stl
Ты снова путаешь причину и следствие. В теории о структуре данных "стек" ничего не должно быть сказано об STL. А вот в статье о С++ классе stack, наоборот должна быть ссылка на теорию. Но ни в одном, ни в другом месте я не вижу запрета на разделение операций. Ты можешь дать ссылку на статью, где указан такой запрет?
Absurd писал(а):Я что-то такое видел в FORTH и JVM.
Имплементировать можно по-одному, а можно по-другому, но даже на википедии не сказано, что реализовать стек можно только через разрушающее чтение, иначе же это уже не будет стеком. А Сионист именно на этом настаивает.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Стек нужен для возврата из подпрограммы в произвольное место вызова
Адрес возврата на x86 лежит там куда указывает указатель фрейма. Для указателя вершины стека допускается локальная разбалансировка.
для вычисления значения математического выражения в постфиксной нотации и много ещё для чего
Еще раз - что мешает использовать std::stack для этого? То что в нем разделили top() и pop() было взвешенным коллегиальным решением многих людей, большинство которых имели научную степень в computer science.

Одно из объяснений лежит, например, тут:

http://ptgmedia.pearsoncmg.com/imprint_ ... _FRAME.HTM
2B OR NOT(2B) = FF
Ответить