ВП_Лекция 13_C_Стек. Очередь.ppt
- Количество слайдов: 22
Лекция 13. C++. Стек. Очередь. Визуальное программирование. Ст. преп. М. А. Сокольская
План. 1. Стек. a) b) c) 2. Очередь. a) b) c) 2 Определение Операции обработки стека. Примеры Определение Операции обработки очереди. Примеры
Для моделирования реальных процессов часто используются линейные списки, в которых включение, исключение и просмотр элементов всегда начинается с первого или последнего звеньев. Такие списки имеют специальные названия и свои особенности обработки. 3
Стек. 4 Определение 1. Стек – однонаправленный список, в котором все включения и удаления выполняются с конца списка. В стеке с помощью некоторой ссылки доступно единственное звено, называемое вершиной стека. Стек организован по принципу LIFO (last in – first out)
head элемент n-1 … NULL элемент 1 Удаление элемента head элемент n-1 … элемент 1 NULL Вставка элемента head 5 элемент n+1 элемент n … NULL элемент 1
Основные операции над стеком 1. 2. 3. 4. Формирование стека Включение звена в стек Обработка элементов стека Удаление звена В начале работы стек пуст, т. е. значением указателя стека является ссылка NULL. 6
Функция добавления звена в стек Функция должна иметь два параметра: имя стека и имя элемента, добавляемого в стек. Функция создает новое звено и делает его вершиной стека. Опишем звено стека. struct stek { int data; struct stek *next; }; 7
8 stek *vstek (stek *ns, int x) { stek *tmp 1; // вспомогательный указатель tmp 1 = new struct stek; /*выделяем память под новый элемент стека*/ tmp 1 -> data = x; // задаем значение tmp 1 -> next = ns; /*добавляем новый элемент в вершину стека*/ ns = tmp 1; return ns; //возвращаем новое значение вершины }
Функция удаления звена из стека Функция должна проверить наличие элементов в стеке, и если стек пуст сообщить об этом. Если стек не пуст удаляем его вершину. Описание звена стека остается тем же, что и для функции добавления звена. 9
10 stek *izsteka (stek *ns) { struct stek *tmp 1; tmp 1 = ns; if (ns == NULL) //при нулевом указателе вершины cout << “Стек пуст!”; else { cout << “Удаляем элемент” << tmp -> data; ns = tmp 1 -> next; //вершина - следующий элемент delete tmp 1; // освобождаем память } return ns; }
Очередь Определение 2 Очередь – однонаправленный список, в котором все удаления производятся в начале списка, а все добавления – в конце списка. 11 Очередь организована по принципу (FIFO – first in – first out) Для организации очереди требуется два указателя – на конец и на начало списка.
head элемент 1 элемент 2 … ends NULL элемент n Удаление элемента head элемент 2 Вставка элемента head элемент 1 … элемент n NULL ends элемент 2 … ends 12 NULL элемент n+1 элемент n
Основные операции над очередью 1. 2. 3. В 13 Начальная установка очереди Включение звена в очередь Удаление звена из очереди начале работы очередь пуста, т. е. значениями указателей на начало и конец очереди является ссылка NULL.
Функция добавления звена в очередь 14 Функция должна иметь три параметра: указатель на начало, указатель на конец и данные, добавляемые в очередь. Функция создает новое звено и добавляет его к очереди. Если очередь пуста, то первый элемент является и последним Опишем звено очереди. struct och { int data; struct och *next; }; struct och *head=NULL, *ends=NULL, *tmp=NULL;
15 void vochered (och **no, och **ko, int x) { struct och *tmp 1; tmp 1 = new struct och; tmp 1 -> data = x; tmp 1 -> next = NULL; if ((*no)==NULL) { (*no) = tmp 1; (*ko) = tmp 1; } else { (*ko) -> next = tmp 1; (*ko) = tmp 1; } }
Функция удаления звена из очереди Функция должна проверить наличие элементов в очереди, и если очередь пуста сообщить об этом. Если очередь не пуста удаляем звено из начала очереди. Описание звена очереди остается тем же, что и для функции добавления звена. 16
17 void izochered (och **no) { och *tmp 1; if (*no == NULL) cout << “Очередь пуста” else { tmp 1 = (*no); *no = (*no) -> next; delete tmp 1; } }
Пример 1. 18 Условие задачи. Текстовый файл состоит из русских букв и оканчивается точкой. Составить программу, которая сначала напечатает все согласные буквы в порядке их следования, затем все гласные в том же порядке. Используем очередь для временного хранения гласных. Согласные буквы печатаем сразу по мере чтения файла. А затем печатаем гласные буквы из очереди.
19 struct node { char num; struct node *next; }; struct node *head=NULL, *ends=NULL; void voch (node **no, node** ko, char k); //описание функций void izoch (node **no); void main () { int i, t=0; char c; char f[10] = {‘а’, ’е’, ’о’, ’и’, ’у’, ’ы’, ’э’, ’ю’, ’я’}; FILE *f 1;
20 clrscr(); f 1 = fopen(“t. dat”, “r”); //открываем файл для чтения while (!feof(f 1)) { fscanf(f 1, “%c”, &c); /*считываем очередной символ в переменную с*/ for (j=0; j
while (head != NULL) //пока очередь не пуста { cout << head -> num; /*вывод элемента на экран*/ izoch (&head); /* удаление звена из очереди*/ } getch(); 21 }
Итоги Мы рассмотрели: Понятие стека и функции работы с ним Понятие очереди и функции работы с очередью 22


