Размещение локальных переменных

Системы программирования для блочно-ориентированных языков (PASCAL, С и др.) используют стек для размещения в нем локальных переменных процедур и иных программных блоков. При каждой активизации процедуры память для ее локальных переменных выделяется в стеке; при завершении процедуры эта память освобождается. Поскольку при вызовах процедур всегда строго соблюдается вложенность, то в вершине стека всегда находится память, содержащая локальные переменные активной в данный момент процедуры.

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

За счет этого в языках PASCAL и С любые процедуры/функции могут вызывать сами себя.

Анализ математических выражений

Рассмотрим математическое выражение, в котором имеется несколько уровней вложения скобок, причем используются три различных типа скобок: квадратные, круглые и фигурные. Закрывающая скобка должна принадлежать к тому же скобочному типу, что и открывающая.

При анализе выражения необходимо не только следить за числом открытых скобок, но и за их типом.

Для решения этой задачи можно воспользоваться стеком. При обнаружении открывающей скобки она заносится в стек. При обнаружении закрывающей скобки анализируется содержимое стека. Если стек пуст, то открывающая скобка отсутствует и выражение составлено неправильно. Если стек не пуст, мы выбираем элемент из стека и проверяем, соответствует ли он типу закрывающей скобки. При совпадении процесс продолжается. В противном случае - ошибка. По окончанию обработки выражения стек должен быть пуст.

Таким образом, возможны четыре варианта окончания анализа выражения:

1. Пришла закрывающая скобка, а стек пуст.

  • 2. Тип закрывающей скобки не соответствует типу открывающей скобки в вершине стека.
  • 3. После завершения анализа всего выражения стек не пуст.
  • 4. После завершения анализа всего выражения стек пуст.

Первые три варианта свидетельствуют о наличии ошибки в выражении, последний - о том, что в выражении скобки расставлены верно.

Использование стека допустимо и при слежении за правильностью вложения циклов и/или условных операторов в языках программирования.

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

Использование двух стеков

Очень часто в программе используется несколько стеков. В этой ситуации может случиться так, что один стек переполнен, в то время как в других еще имеется значительный запас места. Вместо выделения максимального объема памяти для каждого стека предпочтительнее выделять общий пул, или максимальный блок памяти, который могут использовать все стеки.

В частном случае двух стеков это приводит к простому распределению памяти. Первый стек растет вправо, а второй - влево (рис. 6). При таком распределении один из стеков может занимать больше половины памяти. Переполнение может произойти только в том случае, если суммарный объем двух стеков превосходит выделенный объем памяти.

Использование двух стеков

Рис. 6. Использование двух стеков

Например, если в одном стеке хранятся фамилии студентов, успешно сдавших сессию, а второй - студентов, получивших неудовлетворительные оценки, то очевидно, что число элементов в этих стеках взаимосвязано.

К сожалению, такая организация совместного хранения трех и более стеков невозможна.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >