Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

15.2.2. Алгоритм извлечения элемента из стека

В данном алгоритме вершина beginне сдвигается.

1. Устанавливаем текущий указатель на вершину стека: t = begin;

2. Обрабатываем информационную часть текущего элемента (t->info), например, выводим на экран.

3. Переставляем указатель текущего элемента на следующий элемент, адрес которого находится в адресной части текущего:

t=t->Next;

15.2.3. Просмотр стека

1. Устанавливаем текущий указатель на вершину t=begin.

2. Проверяем, если beginравенNULL, то стек пуст, выводим сообщение и либо завершаем работу, либо переходим на формирование стека.

3. Если стек не пуст, начинаем выполнять цикл до тех пор, пока текущий указатель tне равенNULL, т.е. пока не обработаем последний элемент, в адресной части которого находится значениеNULL.

4. Выводим на экран информационную часть текущего элемента:

printf(“\n Элемент: %d”, t -> info); или cout << t->info;

5. Переставляем текущий указатель на следующий элемент:

t=t->Next;

6. Конец цикла.

Функция просмотра стека без сдвига его вершины может выглядеть следующим образом:

void View(Stack *begin)

{

Stack *t = begin;

if(begin == NULL) {

puts(“ Стек пуст! ”);

return;

}

while( t != NULL) {

printf(“ %d \n”, t->info);

t=t->Next;

}

}

Обращение к этой функции: View(begin);

15.2.4. Алгоритм освобождения памяти, занятой стеком

1. Начинаем цикл, выполняющийся пока beginне станет равнымNULL.

2. Устанавливаем текущий указатель на вершину стека: t = begin;

3. Вершину стека переставляем на следующий элемент: begin= t->Next;

4. Уничтожаем текущий (бывшую вершину) элемент, т.е. освобождаем занятую под него память free(t);

Функция освобождения памяти, занятой стеком, будет выглядеть следующим образом:

void Delete_Stack(Stack **begin) {

Stack *t;

while( *begin != NULL) {

t = *begin;

*begin = (*begin) -> Next;

free(t);

}

}

Параметром данной функции является указатель на указатель, так как значение вершины стека передается в функцию и должно быть возвращено из нее. Тогда обращение к функции Delete_Stackс контролем ее выполнения будет следующим:

Delete_Stack(&begin);

if(begin == NULL)

puts(“Free! ”);

. . .

15.2.5. Алгоритм проверки правильности расстановки скобок

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

При реализации алгоритма анализа исходное выражение просматривается слева направо.

1. Если в выражении обнаружена открывающаяся скобка, то анализируем содержимое стека:

а) если стек пуст или не пуст, но в вершине находится тоже открывающая скобка, то записываем ее в стек;

б) если стек не пуст и в вершине находится закрывающая скобка, то обе скобки выбрасываем из рассмотрения (находящуюся в стеке удаляем).

2. Если обнаружена закрывающая скобка и стек пуст, то выражение составлено неверно, выводим сообщение об этом и завершаем работу.

3. Просмотрев все выражение, проверяем стек и, если он не пуст, то баланс скобок нарушен и выражение составлено неверно, выводим сообщение об этом и завершаем работу.

По такому принципу работают все компиляторы, проверяя баланс круглых скобок в выражениях, баланс фигурных скобок во вложенных блоках, вложенные циклы и т.п.