Динамические структуры данных. Лекция 10 (продолжение)

Содержание

Слайд 2

Стеки

Вопрос 3

Стеки Вопрос 3

Слайд 3

Особенности стека

Стек – это частный случай однонаправленного списка, добавление элементов в который

Особенности стека Стек – это частный случай однонаправленного списка, добавление элементов в
и выборка из которого выполняются с одного конца, называемого вершиной стека.
Другие операции со стеком не определены.
При выборке элемент исключается из стека.
Стек реализует принцип обслуживания LIFO (last in – first out, последним пришел – первым ушел).

Слайд 4

Пример программы

Задание:
Программа должна формировать стек из пяти целых чисел (1,2, 3, 4,

Пример программы Задание: Программа должна формировать стек из пяти целых чисел (1,2,
5) и выводить его на экран.
Замечания:
Функция помещения в стек по традиции называется push, а выборки – pop.
Указатель для работы со стеком (top) всегда ссылается на его вершину.

Слайд 5

Текст программы

#include "stdafx.h"
#include "conio.h"
#include
using namespace std;
//Структура, описывающая элемент стека
struct Node{
int d;
Node

Текст программы #include "stdafx.h" #include "conio.h" #include using namespace std; //Структура, описывающая
*p;
};

Слайд 6

Текст программы
//Список функций программы
Node * first(int d);
void push(Node **top, int d);
int pop(Node

Текст программы //Список функций программы Node * first(int d); void push(Node **top,
**top);

Слайд 7

Текст программы

int _tmain(int argc, _TCHAR* argv[])
{
Node *top = first(1); //Формирование первого //элемента стека
for

Текст программы int _tmain(int argc, _TCHAR* argv[]) { Node *top = first(1);
(int i = 2; i<6; i++) //Заполнение стека
push(&top, i);
while (top) //Вывод
// содержимого стека на экран
cout << pop(&top) << ' ';
getch();
return 0;
}

Слайд 8

Текст программы

//Функция начального формирования стека
Node *first(int d)
{
Node *pv = new Node;
pv->d =

Текст программы //Функция начального формирования стека Node *first(int d) { Node *pv
d;
pv->p = 0;
return pv;
}

Слайд 9

Текст программы

//Функция занесения нового элемента в стек
void push(Node **top, int d)
{
Node *pv

Текст программы //Функция занесения нового элемента в стек void push(Node **top, int
= new Node;
pv->d = d;
pv->p = *top;
*top = pv;
}

Слайд 10

Текст программы

//Функция выборки элемента из стека
int pop(Node **top)
{
int temp = (*top)->d;
Node *pv

Текст программы //Функция выборки элемента из стека int pop(Node **top) { int
= *top;
*top = (*top)->p;
delete pv;
return temp;
}

Слайд 11

Результат

Результат работы программы
5 4 3 2 1

Результат Результат работы программы 5 4 3 2 1

Слайд 12

Очереди

Вопрос 4

Очереди Вопрос 4

Слайд 13

Особенности

Очередь – это частный случай однонаправленного списка, добавление элементов в который выполняется

Особенности Очередь – это частный случай однонаправленного списка, добавление элементов в который
в один конец, а выборка – из другого конца.
Другие операции с очередью не определены.
При выборке элемент исключается из очереди.
Очередь реализует принцип обслуживания FIFO (first in – first out, первым пришел – первым ушел)

Слайд 14

Пример программы

Задание:
Программа должна формировать очередь из пяти целых чисел (1,2, 3, 4,

Пример программы Задание: Программа должна формировать очередь из пяти целых чисел (1,2,
5) и выводить его на экран.
Замечание:
Функция помещения в конец очереди называется add, а выборки – del. Указатель на начало очереди называется pbeg, указатель на конец – pend.

Слайд 15

Текст программы

#include "stdafx.h"
#include "conio.h"
#include
using namespace std;
//Структура, описывающая элемент очереди
struct Node{
int d;
Node

Текст программы #include "stdafx.h" #include "conio.h" #include using namespace std; //Структура, описывающая
*p;
};

Слайд 16

Текст программы

//Список функций программы
Node *first(int d);
void add(Node **pend, int d);
int del(Node **pbeg);

Текст программы //Список функций программы Node *first(int d); void add(Node **pend, int d); int del(Node **pbeg);

Слайд 17

Текст программы

int _tmain(int argc, _TCHAR* argv[])
{
Node *pbeg = first(1); // Формирование первого //

Текст программы int _tmain(int argc, _TCHAR* argv[]) { Node *pbeg = first(1);
элемента очереди
Node *pend = pbeg;
for (int i = 2; i<6; i++) // Заполнение очереди
add(&pend, i);
while (pbeg) // Выборка элементов из // очереди
cout << del(&pbeg) << ' ';
getch();
return 0;
}

Слайд 18

Текст программы

//Функция формирования первого элемента очереди
Node *first(int d)
{
Node *pv = new Node;
pv->d

Текст программы //Функция формирования первого элемента очереди Node *first(int d) { Node
= d;
pv->p = 0;
return pv;
}

Слайд 19

Текст программы

//Функция добавления элемента в конец очереди
void add(Node **pend, int d)
{
Node *pv

Текст программы //Функция добавления элемента в конец очереди void add(Node **pend, int
= new Node;
pv->d = d;
pv->p = 0;
(*pend)->p = pv;
*pend = pv;
}

Слайд 20

Текст программы

//Функция выборки элементов из очереди
int del(Node **pbeg)
{
int temp = (*pbeg)->d;
Node *pv

Текст программы //Функция выборки элементов из очереди int del(Node **pbeg) { int
= *pbeg;
*pbeg = (*pbeg)->p;
delete pv;
return temp;
}

Слайд 21

Результат

Результат работы программы
1 2 3 4 5

Результат Результат работы программы 1 2 3 4 5

Слайд 22

Бинарные деревья

Вопрос 5

Бинарные деревья Вопрос 5

Слайд 23

Особенности

Бинарное дерево – это динамическая структура данных, состоящая из узлов, каждый из

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

Слайд 24

Пример бинарного дерева

Пример бинарного дерева

Слайд 25

Дерево поиска

Если дерево организовано таким образом, что для каждого узла все ключи

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

Слайд 26

Рекурсивная функция обхода узлов дерева

function way_around ( дерево )
{
way_around ( левое

Рекурсивная функция обхода узлов дерева function way_around ( дерево ) { way_around
поддерево )
посещение корня
way_around ( правое поддерево )
}

Слайд 27

Операции с бинарными деревьями
– включение узла в дерево;
– поиск по дереву;
– обход

Операции с бинарными деревьями – включение узла в дерево; – поиск по
дерева;
– удаление узла.

Слайд 28

Пример программы

Задание:
Программа должна формировать дерево из массива целых чисел и выводит его

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

Слайд 29

Текст программы

#include "stdafx.h"
#include "conio.h"
#include
using namespace std;
//Структура описывающая узел дерева
struct Node{
int d;
Node

Текст программы #include "stdafx.h" #include "conio.h" #include using namespace std; //Структура описывающая
*left;
Node *right;
};

Слайд 30

Текст программы
//Список функций программы
Node *first(int d);
Node *search_insert(Node *root, int d);
void print_tree(Node *root,

Текст программы //Список функций программы Node *first(int d); Node *search_insert(Node *root, int
int level);

Слайд 31

Текст программы

int _tmain(int argc, _TCHAR* argv[])
{
// Массив для формирования дерева
int b[] =

Текст программы int _tmain(int argc, _TCHAR* argv[]) { // Массив для формирования
{10, 25, 20, 6, 21, 8, 1, 30};
Node *root = first(b[0]); // Создание корня дерева
for (int i = 1; i<8; i++)
search_insert(root, b[i]); // Размещение элементов
// на дереве
print_tree(root, 0); // Вывод элементов
//бинарного дерева
// на экран
getch();
return 0;
}

Слайд 32

Текст программы

//Функция формирования первого элемента дерева
Node *first(int d){
Node *pv = new Node;
pv->d

Текст программы //Функция формирования первого элемента дерева Node *first(int d){ Node *pv
= d;
pv->left = 0;
pv->right = 0;
return pv;
}

Слайд 33

Текст программы

//Функция поиска с включением узла в дерево
Node *search_insert(Node *root, int d)
{
Node

Текст программы //Функция поиска с включением узла в дерево Node *search_insert(Node *root,
*pv = root, *prev;
bool found = false;
while (pv && !found)
{
prev = pv;
if (d == pv->d)
found = true;
else
if (d < pv->d)
pv = pv->left;
else
pv = pv->right;
}

Слайд 34

Текст программы

if (found)
return pv;
Node *pnew = new Node;
pnew->d = d;
pnew->left = 0;
pnew->right

Текст программы if (found) return pv; Node *pnew = new Node; pnew->d
= 0;
if (d < prev->d)
// Присоединение к левому поддереву предка
prev->left = pnew;
else
// Присоединение к правому поддереву предка
prev->right = pnew;
return pnew;
}

Слайд 35

Текст программы

//Функция обхода дерева
void print_tree(Node *p, int level)
{
if (p)
{
print_tree(p->left, level+1); // вывод левого

Текст программы //Функция обхода дерева void print_tree(Node *p, int level) { if
// поддерева
for (int i = 0; i cout << " ";
cout << p->d << "\n"; // вывод корня // поддерева
print_tree(p->right, level + 1); // вывод правого // поддерева
}
}
Имя файла: Динамические-структуры-данных.-Лекция-10-(продолжение).pptx
Количество просмотров: 22
Количество скачиваний: 0