Стеки и очереди презентация

Содержание

Слайд 2

Стеки

Стеки

Слайд 3

Стек. Связный список Хранить указатель на первый элемент связного списка; вставку/удаление делать с вершины стека

Стек. Связный список

Хранить указатель на первый элемент связного списка; вставку/удаление делать

с вершины стека
Слайд 4

Изъять элемент из стека. Реализация с помощью связного списка

Изъять элемент из стека. Реализация с помощью связного списка

Слайд 5

Добавить элемент в стек. Реализация с помощью связного списка

Добавить элемент в стек. Реализация с помощью связного списка

Слайд 6

Стек. Реализация на Java

Стек. Реализация на Java

Слайд 7

Стек. Производительность реализации с помощью связного списка Каждая операция производится

Стек. Производительность реализации с помощью связного списка

Каждая операция производится за время

равное константе
Стек из N элементов испольщует ~ 40N байт

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

Слайд 8

Стек. Реализация с помощью массива Массив s[] для хранения N

Стек. Реализация с помощью массива

Массив s[] для хранения N элементов стека
push():

добавит новый элемент в s[N]
pop(): изъять элемент из s[N-1]

Дефект. Переполнение массива

Слайд 9

Стек. Реализация с помощью массива

Стек. Реализация с помощью массива

Слайд 10

Стек. Некоторые соображения Переполнение и изъятие из пустого стека Изъятие

Стек. Некоторые соображения

Переполнение и изъятие из пустого стека
Изъятие из пустого стека:

исключительная ситуация
Переполнение: изменить размер массива
null: свободное место в массиве
Бесхозные ссылки: хранение ссылок на объекты, когда они больше не нужны
Слайд 11

Изменение размера массива

Изменение размера массива

Слайд 12

Стек: изменение размера массива Проблема. От клиента требуется указывать размер

Стек: изменение размера массива

Проблема. От клиента требуется указывать размер стека
Как увеличивать

и уменьшать размер массива?
Первый подход
push(): увеличивать размер массива s[] на 1
pop(): уменьшать размер массива s[] на 1
Стоимость
Требуется копировать все элементы в новый массив
Сложность вставки первых N элементов 1+2+3+...+N ~ N2/2
Слайд 13

Стек: изменение размера массива Если массив полон, то создать новый

Стек: изменение размера массива

Если массив полон, то создать новый массив в

два раза больше и копировать элементы

Стоимость. Сложность вставки первых N элементов пропорциональна N

Слайд 14

Стек: амортизированная стоимость добавления в стек Стоимость добавления первых N

Стек: амортизированная стоимость добавления в стек

Стоимость добавления первых N элементов: N

+ (2 + 4 + 8 + … + N) ~ 3N
Слайд 15

Стек: изменение размера массива Как изменять размер массива? Первый подход

Стек: изменение размера массива

Как изменять размер массива?
Первый подход
push(): увеличивать размер массива

s[] в два раза, когда массив полон
pop(): уменьшать размер массива s[] в два раза, когда массив на половину пуст
Худший случай дорог
Представим push-pop-push-pop-..., когда массив полон
Сложность каждой операции пропорциональна N
Слайд 16

Стек: изменение размера массива Эффективный подход push(): увеличивать размер массива

Стек: изменение размера массива

Эффективный подход
push(): увеличивать размер массива s[] в два

раза, когда массив полон
pop(): уменьшать размер массива s[] в два раза, когда массив заполнен на четверть

Массив заполнен от 25% до 100%

Слайд 17

Стек: изменение размера массива

Стек: изменение размера массива

Слайд 18

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

Стек: амортизированный анализ

Предположение. Начиная с пустого стека, последовательность из M push/pop

операций занимает время пропорциональное M
Слайд 19

Стек: использование памяти Предположение. Используется от ~ 8N до ~

Стек: использование памяти

Предположение. Используется от ~ 8N до ~ 32N байт

для стека из N элементов
~ 8N когда стек полон
~ 32N когда стек заполнен на четверть

Учитывается память, занимаемая самим стеком, но не данными

Слайд 20

Реализация стек: массив и связный список Компромисс. Сделать две реализации

Реализация стек: массив и связный список

Компромисс. Сделать две реализации стека и

дать возможность клиенту выбрать.
Связный список
Каждая операция занимает константное время в худшем случае
Использует дополнительное время и память для организации ссылок
Массив
Каждая операция занимает константное амортизированное время
Занимает меньше памяти
Слайд 21

Очередь

Очередь

Слайд 22

Очередь: связный список Хранить указатели на первый и последний элемент; вставка/удаление элементов происходит с противоположных концов

Очередь: связный список

Хранить указатели на первый и последний элемент; вставка/удаление элементов

происходит с противоположных концов
Слайд 23

Очередь: удаление элемента Аналогична операции pop() для стека

Очередь: удаление элемента

Аналогична операции pop() для стека

Слайд 24

Очередь: вставка элемента

Очередь: вставка элемента

Слайд 25

Очередь: реализация на Java

Очередь: реализация на Java

Слайд 26

Применение очередей, контейнеров и стеков

Применение очередей, контейнеров и стеков

Слайд 27

Применение стека

Применение стека

Слайд 28

Вычисление арифметических выражений Цель. Вычислить выражение в инфиксной форме Двустековый

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

Цель. Вычислить выражение в инфиксной форме

Двустековый алгоритм Дейкстры
Значение: занести

в стек значений
Оператор: занести в стек оператор
Левая скобка: игнорируем
Правая скобка: выталкиваем оператор и два значения, выполняем операцию и заносим в стек значений
Где используется?
Интерпретатор
Имя файла: Стеки-и-очереди.pptx
Количество просмотров: 54
Количество скачиваний: 0