16
правок
Изменения
→Алгоритм
== Алгоритм ==
=== Структура стека ===
Как всегда каждый элемент стека содержит информацию о хранимом значении и указатель на следующий элемент. Также имеем указатель на голову стека <tex>H</tex>, который будем изменять при помощи операции <tex>CAS</tex>. Если <tex>H==NULLnull</tex>, то стек - — пуст.
=== Удаление элементов ===
Запомним, на что указывает голова стека (запишем в локальную переменную <tex>head</tex>). Значение, которое хранит в себе <tex>head - </tex>, — то, что необходимо будет вернуть. Попробуем переместить голову стеком CASом<tex>CAS</tex>ом. Если удалось - — вернем <tex>head.value</tex>. Если нет, то это означает, что с момента начала операции стек был изменен. Поэтому попробуем проделать операцию заново.
=== Добавление элементов ===
Запомним, куда указывает голова стека (запишем в локальную переменную <tex>head</tex>). Создадим новый элемент, который хотим добавить в начало стека. Указатель на следующее значение для него - — <tex>head</tex>. Попробуем переместить H на новый элемент, при помощи <tex>CAS</tex>. Если это удалось - — добавление прошло успешно. Если нет, то кто-то другой изменил стек, пока мы пытались добавить элемент. Придется начинать сначала.
== Псевдокод ==