Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[ЭМЛ] Лекция 14.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
811.52 Кб
Скачать

[Править] Программный стек [править] Организация в памяти

Зачастую стек реализуется в виде однонаправленного списка(каждый элемент списка указывает только на следующий). Но в таком случае невозможно применить операцию обхода элементов. А доступ возможен только к верхнему элементу структуры. Для обхода такой проблемы можно взять за основу двусвязный список(каждый элемент указывает на обоих соседей справа и слева). Кроме того можно организовать его на обыкновенном массиве.

Значением переменной стека является указатель на вершину стека. Если стек пуст, то значение указателя равно NULL.

Пример реализации стека на языке Си:

struct stack

{

char *data;

struct stack next;

};

[Править] Операции со стеком

Возможны три операции со стеком: добавление элемента(иначе проталкивание, push), удаление элемента(pop) и чтение головного элемента(peek)[5].

При проталкивании(push) указывается новый элемент, указывающий на элемент бывший до этого головой. Новый элемент теперь становится головным.

При удалении элемента убирается первый, а головным становится тот на который был указатель у этого объекта(следующий элемент).

void push( STACK *ps, int x ) // Добавление в стек нового элемента

{

if ( ps->size == STACKSIZE ) // Не переполнен ли стек?

{

fputs( "Error: stack overflow\n", stderr );

abort();

}

else

{

ps->items[ps->size++] = x;

}

}

int pop( STACK *ps ) // Удаление из стека

{

if ( ps->size == 0 ) // Не опустел ли стек?

{

fputs( "Error: stack underflow\n", stderr );

abort();

}

else

{

return ps->items[--ps->size];

}

}

[Править] Аппаратный стек (Hardware stack)

Аппаратный стек — непрерывная область памяти, адресуемая специальными регистрами ESP (указатель стека) и SS (селектор сегмента стека)[6].

До использования стека он должен быть инициализирован так, чтобы регистры SS:ESP указывали на область реальной оперативной памяти (стек в ПЗУ, естественно, работать не может). Прикладные программы, как правило, от операционной системы получают готовый к употреблению стек. В защищенном режиме сегмент состояния задачи содержит четыре селектора сегментов стека (для разных уровней привилегий), но в каждый момент используется, естественно, только один стек[7].

[Править] Область применения [править] Аппаратный стек

Стек применяется в случаях, когда необходимо организовать прерывания вызовов и возвратов(см. локальная область видимости у функций в си–подобных языках), либо в случаях, когда нужно организовать временное хранилище данных места в памяти(переменные, параметры функции)[6].

[Править] Программный стек

Программный вид стека используется для обхода структур данных, например, дерево или граф. При использовании рекурсивных функций так же будет применяться стек, но аппаратный его вид. Кроме этих назначений стек используется для организации стековой машины.

Для отслеживания точек возврата из подпрограмм используется стек вызовов.

Арифметические сопроцессоры, программируемые микрокалькуляторы и язык Forth используют стековую модель вычислений[8].

Идея стека используется в стековой машине среди стековых языков программирования.