Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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




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! ”);

             ...

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

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

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

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

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

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

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

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

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

 

Структура данных ОЧЕРЕДЬ

Очередь – упорядоченный набор данных (структура данных), в котором в отличие от стека извлечение данных происходит из начала цепочки, а добавление данных – в конец этой цепочки.

    Очередь также называют структурой данных, организованной по принципу FIFO (First In, First Out) – первый вошел (первый созданный элемент очереди), первый вышел.

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

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

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

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

Шаблон элемента структуры, информационной частью которого является целое число, может иметь следующий вид:

struct Spis {

                       int info;

                       Spis *Next;

              };

При организации очереди обычно используют два указателя

Spis *begin, *end;

где begin и end – указатели на начало и конец очереди соответственно, т.е. при создании очереди мы организуем структуру данных следующего вида:

каждый элемент которой имеет информационную infо и адресную Next (A 1, A 2, ...) части.

Основные операции с очередью следующие:

– формирование очереди;

– добавление нового элемента в конец очереди;

– удаление элемента из начала очереди.

Формирование очереди

Формирование очереди состоит из двух этапов: создание первого элемента, добавление нового элемента в конец очереди.

Создание первого элемента очереди

Этот этап заключается в создании первого элемента, для которого адресная часть должна быть нулевой (NULL). Для этого нужно:

1) ввести информацию для первого элемента (целое число i);

2) захватить память, используя текущий указатель:

      t = (Spis*) malloc(sizeof(Spis)); или t = new Spis;

в результате формируется конкретный адрес (А 1) для первого элемента;

3) сформировать информационную часть:

      t -> info = i;    (обозначим i 1)

4) в адресную часть занести NULL:

      t -> Next = NULL;

5) указателям на начало и конец очереди присвоить значение t:

      begin = end = t;

На этом этапе получим следующее:

        

Добавление элемента в очередь

Рассмотрим алгоритм добавления только для второго элемента.

1. Ввод информации для текущего (второго) элемента – значение i.

2. Захватываем память под текущий элемент:

t = (Spis*) malloc (sizeof(Spis)); или t = new Spis; 

3. Формируем информационную часть (обозначим i 2):

t -> info = i;

4. В адресную часть созданного элемента (текущего) заносим NULL, т.к. этот элемент становится последним:

t -> Next = NULL;

5. Элемент добавляется в конец очереди, поэтому в адресную часть бывшего последнего элемента end  заносим адрес созданного:

end -> Next = t;

бывший последний элемент становится предпоследним.

6. Переставляем указатель последнего элемента на добавленный:

end = t;

В результате получим

Для добавления в очередь любого количества элементов организуется цикл, включающий пункты 1– 6 рассмотренного алгоритма. Завершение цикла реализуется в зависимости от поставленной задачи.

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

void Create(Spis **begin, Spis **end) { 

Spis *t = (Spis*) malloc(sizeof(Spis));

printf(“\n Input Info ”);

scanf(“%d”, &t -> info);

t -> Next = NULL;

if(*begin == NULL)           // Формирование первого элемента

              *begin = *end = t;

    else {

                       (*end) -> Next = t;             // Добавление в конец

                       *end = t;

}

    }

Участок программы с обращением к функции Create для добавление необходимого количества элементов в очередь может иметь следующий вид:

¼

Spis *begin = NULL, *end;

int repeat = 1;

while(repeat) {                // repeat=1 – продолжение ввода данных

    Create(&begin, &end); 

    printf(“ Stop - 0 ”); // repeat=0 – конец ввода данных

    scanf(“%d”, &repeat);

}

¼





Поделиться с друзьями:


Дата добавления: 2018-10-14; Мы поможем в написании ваших работ!; просмотров: 305 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Наглость – это ругаться с преподавателем по поводу четверки, хотя перед экзаменом уверен, что не знаешь даже на два. © Неизвестно
==> читать все изречения...

2853 - | 2439 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.