Similar presentations:
Cписок и другие абстрактные типы данных
1.
Cписок идругие абстрактные типы данных
Лекция 8
2.
23.
План лекции• Абстрактные типы данных
– Несколько примеров
– Определение
– Зачем использовать АТД
• АТД список
– Реализация на языке Си через 1-связные списки
• АТД на основе списков
• Примеры использования стека
– Построение польской записи арифметического выражения
– Вычисление значения польской записи на стеке
3
4.
Кто придумал абстрактные типы данных?4
5.
• Барбара Лисков р. 1939• Стивен Жиль р. ?
• Liskov B., Zilles S. Programming
with abstract data types //
SIGPlan Notices, vol. 9, no. 4,
1974
– Использование метода
абстракции в программировании
на примере построения польской
записи выражения с помощью
стека
Барбара Лисков Barbara Liskov
https://en.wikipedia.org/wiki/Barbara_Liskov
Премия Тьюринга 2008
Кто придумал абстрактные типы данных?
5
6.
• Барбара Лисков р. 1939• Стивен Жиль
• Liskov B., Zilles S. Programming
with abstract data types //
SIGPlan Notices, vol. 9, no. 4,
1974
– Использование метода
абстракции в программировании
на примере построения польской
записи выражения с помощью
стека
Барбара Лисков Barbara Liskov 1939
https://en.wikipedia.org/wiki/Barbara_Liskov
Премия Тьюринга 2008
Кто придумал абстрактные типы данных?
6
7.
• Барбара Лисков р. 1939• Стивен Жиль
• Liskov B., Zilles S. Programming
with abstract data types //
SIGPlan Notices, vol. 9, no. 4,
1974
– Использование метода
абстракции в программировании
на примере построения польской
записи выражения с помощью
стека
Барбара Лисков Barbara Liskov
https://en.wikipedia.org/wiki/Barbara_Liskov
Премия Тьюринга 2008
Кто придумал абстрактные типы данных?
7
8.
Примеры АТДСистема регулирования скорости
Кофемолка
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение
скорости
Отключить систему
Включить
Выключить
Задать скорость
Начать
перемалывание
Прекратить
перемалывание
8
9.
By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=1086183
Примеры АТД
Система регулирования скорости
Кофемолка
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение
скорости
Отключить систему
Включить
Выключить
Задать скорость
Начать
перемалывание
Прекратить
перемалывание
9
10.
By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=1086183
Примеры АТД
Система регулирования скорости
Кофемолка
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение
скорости
Отключить систему
Включить
Выключить
Задать скорость
Начать
перемалывание
Прекратить
перемалывание
10
11.
By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=1086183
Примеры АТД
Система регулирования скорости
Кофемолка
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение
скорости
Отключить систему
Включить
Выключить
Задать скорость
Начать
перемалывание
Прекратить
перемалывание
11
12.
By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=1086183
Примеры АТД
Система регулирования скорости
Кофемолка
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение
скорости
Отключить систему
Включить
Выключить
Задать скорость
Начать
перемалывание
Прекратить
перемалывание
12
13.
By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=1086183
Примеры АТД
Система регулирования скорости
Кофемолка
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение
скорости
Отключить систему
Включить
Выключить
Задать скорость
Начать
перемалывание
Прекратить
перемалывание
13
14.
By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=1086183
Примеры АТД
Система регулирования скорости
Кофемолка
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение
скорости
Отключить систему
Включить
Выключить
Задать скорость
Начать
перемалывание
Прекратить
перемалывание
14
15.
Примеры АТДТопливный бак
Список
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака
Инициализировать список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
15
16.
Примеры АТДТопливный бак
Список
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака
Инициализировать список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
16
17.
Примеры АТДТопливный бак
Список
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака
Инициализировать список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
17
18.
Примеры АТДТопливный бак
Список
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака
Инициализировать список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
18
19.
Примеры АТДТопливный бак
Список
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака
Инициализировать список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
19
20.
Примеры АТДТопливный бак
Список
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака
Создать/уничтожить список
Вставить/удалить/изменить элемент
Навигация по элементам
20
21.
Примеры АТДТопливный бак
Список
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака
Создать/уничтожить список
Вставить/удалить/изменить элемент
Навигация по элементам
21
22.
Примеры АТДФонарь
• Включить
• Выключить
Стек
• Инициализировать стек
• Поместить элемент
• Извлечь элемент
• Проверить наличие элементов
22
23.
Примеры АТДФонарь
• Включить
• Выключить
Стек
• Инициализировать стек
• Поместить элемент
• Извлечь элемент
• Проверить наличие элементов
23
24.
Примеры АТДФонарь
• Включить
• Выключить
Стек
• Инициализировать стек
• Поместить элемент
• Извлечь элемент
• Проверить наличие элементов
24
25.
Примеры АТДФонарь
• Включить
• Выключить
Стек
• Инициализировать стек
• Поместить элемент
• Извлечь элемент
• Проверить наличие элементов
25
26.
Примеры АТДФонарь
• Включить
• Выключить
Стек
• Инициализировать стек
• Поместить элемент
• Извлечь элемент
• Проверить наличие элементов
26
27.
Примеры АТДФонарь
• Включить
• Выключить
Стек
• Инициализировать стек
• Поместить элемент
• Извлечь элемент
• Проверить наличие элементов
27
28.
Примеры АТДФонарь
• Включить
• Выключить
Стек
• Инициализировать стек
• Поместить элемент
• Извлечь элемент
• Проверить наличие элементов
28
29.
Примеры АТДУказатель
• Выделить блок памяти
• Освободить блок памяти
• Изменить объем выделенной
памяти
Файл
• Открыть
• Прочитать байты
• Записать байты
• Установить позицию
чтения/записи
• Закрыть
29
30.
Примеры АТДУказатель
• Выделить блок памяти
• Освободить блок памяти
• Изменить объем выделенной
памяти
Файл
• Открыть
• Прочитать байты
• Записать байты
• Установить позицию
чтения/записи
• Закрыть
30
31.
Примеры АТДУказатель
• Выделить блок памяти
• Освободить блок памяти
• Изменить объем выделенной
памяти
Файл
• Открыть
• Прочитать байты
• Записать байты
• Установить позицию
чтения/записи
• Закрыть
31
32.
Примеры АТДУказатель
• Выделить блок памяти
• Освободить блок памяти
• Изменить объем выделенной
памяти
Файл
• Открыть
• Прочитать байты
• Записать байты
• Установить позицию
чтения/записи
• Закрыть
32
33.
Примеры АТДУказатель
• Выделить блок памяти
• Освободить блок памяти
• Изменить объем выделенной
памяти
Файл
• Открыть
• Прочитать байты
• Записать байты
• Установить позицию
чтения/записи
• Закрыть
33
34.
Определение АТД• Абстрактный тип данных – это множество значений и набор операций,
для которых не важно представление этих значений в памяти
• АТД – это семейство обычных типов данных, которые используются и
ведут себя одинаково
• Реализация АТД – это один из обычных типов данных, принадлежащих
семейству, которое задает АТД
– Конкретный набор подпрограмм, выполняющих операции над конкретными
значениями в памяти
– Один АТД может допускать несколько принципиально разных реализаций
34
35.
Определение АТД• Абстрактный тип данных – это множество значений и набор операций,
для которых не важно представление этих значений в памяти
• АТД – это семейство обычных типов данных, которые используются и
ведут себя одинаково
• Реализация АТД – это один из обычных типов данных, принадлежащих
семейству, которое задает АТД
– Конкретный набор подпрограмм, выполняющих операции над конкретными
значениями в памяти
– Один АТД может допускать несколько принципиально разных реализаций
35
36.
Определение АТД• Абстрактный тип данных – это множество значений и набор операций,
для которых не важно представление этих значений в памяти
• АТД – это семейство обычных типов данных, которые используются и
ведут себя одинаково
• Реализация АТД – это один из обычных типов данных, принадлежащих
семейству, которое задает АТД
– Конкретный набор подпрограмм, выполняющих операции над конкретными
значениями в памяти
– Один АТД может допускать несколько принципиально разных реализаций
36
37.
Определение АТД• Абстрактный тип данных – это множество значений и набор операций,
для которых не важно представление этих значений в памяти
• АТД – это семейство обычных типов данных, которые используются и
ведут себя одинаково
• Реализация АТД – это один из обычных типов данных, принадлежащих
семейству, которое задает АТД
– Конкретный набор подпрограмм, выполняющих операции над конкретными
значениями в памяти
– Один АТД может допускать несколько принципиально разных реализаций
37
38.
Определение АТД• Абстрактный тип данных – это множество значений и набор операций,
для которых не важно представление этих значений в памяти
• АТД – это семейство обычных типов данных, которые используются и
ведут себя одинаково
• Реализация АТД – это один из обычных типов данных, принадлежащих
семейству, которое задает АТД
– Конкретный набор подпрограмм, выполняющих операции над конкретными
значениями в памяти
– Один АТД может допускать несколько принципиально разных реализаций
38
39.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
39
40.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
40
41.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
Контейнер
Список (list)
Другие названия
Типичные реализации
Последовательность, sequence 1-связный список
Очередь (queue)
FIFO
Массив, 1-связный список
Дек (double-ended queue)
Dequeue, deque
2-связный список, список блоков
Стек (stack)
Магазин, LIFO
Массив, 1-связный список
Очередь с приоритетом (priority queue)
Пирамида, heap
массив-пирамида
Ассоциативный массив (associative array)
Словарь, dictionary, hash map,
Хэш-таблица
hash, map, хэш
Множество (set)
Красно-черное дерево, хэш-таблица
41
42.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
Контейнер
Список (list)
Другие названия
Типичные реализации
Последовательность, sequence 1-связный список
Очередь (queue)
FIFO
Массив, 1-связный список
Дек (double-ended queue)
Dequeue, deque
2-связный список, список блоков
Стек (stack)
Магазин, LIFO
Массив, 1-связный список
Очередь с приоритетом (priority queue)
Пирамида, heap
массив-пирамида
Ассоциативный массив (associative array)
Словарь, dictionary, hash map,
Хэш-таблица
hash, map, хэш
Множество (set)
Красно-черное дерево, хэш-таблица
42
43.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
Контейнер
Список (list)
Другие названия
Типичные реализации
Последовательность, sequence 1-связный список
Очередь (queue)
FIFO
Массив, 1-связный список
Дек (double-ended queue)
Dequeue, deque
2-связный список, список блоков
Стек (stack)
Магазин, LIFO
Массив, 1-связный список
Очередь с приоритетом (priority queue)
Пирамида, heap
массив-пирамида
Ассоциативный массив (associative array)
Словарь, dictionary, hash map,
Хэш-таблица
hash, map, хэш
Множество (set)
Красно-черное дерево, хэш-таблица
43
44.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
Контейнер
Список (list)
Другие названия
Типичные реализации
Последовательность, sequence 1-связный список
Очередь (queue)
FIFO
Массив, 1-связный список
Дек (double-ended queue)
Dequeue, deque
2-связный список, список блоков
Стек (stack)
Магазин, LIFO
Массив, 1-связный список
Очередь с приоритетом (priority queue)
Пирамида, heap
массив-пирамида
Ассоциативный массив (associative array)
Словарь, dictionary, hash map,
Хэш-таблица
hash, map, хэш
Множество (set)
Красно-черное дерево, хэш-таблица
44
45.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
Контейнер
Список (list)
Другие названия
Типичные реализации
Последовательность, sequence 1-связный список
Очередь (queue)
FIFO
Массив, 1-связный список
Дек (double-ended queue)
Dequeue, deque
2-связный список, список блоков
Стек (stack)
Магазин, LIFO
Массив, 1-связный список
Очередь с приоритетом (priority queue)
Пирамида, heap
массив-пирамида
Ассоциативный массив (associative array)
Словарь, dictionary, hash map,
Хэш-таблица
hash, map, хэш
Множество (set)
Красно-черное дерево, хэш-таблица
45
46.
Контейнеры• Контейнер – это АТД, использующийся для группировки
элементов и доступа к ним
Контейнер
Список (list)
Другие названия
Типичные реализации
Последовательность, sequence 1-связный список
Очередь (queue)
FIFO
Массив, 1-связный список
Дек (double-ended queue)
Dequeue, deque
2-связный список, список блоков
Стек (stack)
Магазин, LIFO
Массив, 1-связный список
Очередь с приоритетом (priority queue)
Пирамида, heap
массив-пирамида
Ассоциативный массив (associative array)
Словарь, dictionary, hash map,
Хэш-таблица
hash, map, хэш
Множество (set)
Красно-черное дерево, хэш-таблица
46
47.
Зачем использовать АТД?Реализация АТД
Использование АТД
• Скрываем детали реализации
• Пишем более понятно
• Работаем с сущностями
решаемой задаи
– Упрощаем оптимизацию кода
• Ограничиваем область
использования данных
• Ограничиваем область
изменений в коде
– А не с деталями реализации
47
48.
Зачем использовать АТД?Реализация АТД
Использование АТД
• Скрываем детали реализации
• Пишем более понятно
• Работаем с сущностями
решаемой задаи
– Упрощаем оптимизацию кода
• Ограничиваем область
использования данных
• Ограничиваем область
изменений в коде
– А не с деталями реализации
48
49.
Зачем использовать АТД?Реализация АТД
Использование АТД
• Скрываем детали реализации
• Пишем более понятно
• Работаем с сущностями
решаемой задаи
– Упрощаем оптимизацию кода
• Ограничиваем область
использования данных
• Ограничиваем область
изменений в коде
– А не с деталями реализации
49
50.
Зачем использовать АТД?Реализация АТД
Использование АТД
• Скрываем детали реализации
• Пишем более понятно
– Упрощаем оптимизацию кода
• Ограничиваем область
использования данных
• Ограничиваем область
изменений в коде
– Про сущности решаемой задачи,
а не про детали реализации
• Решаем задачу независимо от
реализации АТД
50
51.
АТД список• Конечная последовательность элементов
–
–
–
–
–
–
–
–
–
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент» списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
51
52.
АТД список• Конечная последовательность элементов
–
–
–
–
–
–
–
–
–
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент» списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
52
53.
АТД список• Конечная последовательность элементов
–
–
–
–
–
–
–
–
–
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент» списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
53
54.
АТД список• Конечная последовательность элементов
–
–
–
–
–
–
–
–
–
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент» списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
54
55.
АТД список• Конечная последовательность элементов
–
–
–
–
–
–
–
–
–
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент» списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
55
56.
АТД список• Конечная последовательность элементов
–
–
–
–
–
–
–
–
–
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент» списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
56
57.
АТД список• Конечная последовательность элементов
–
–
–
–
–
–
–
–
–
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент» списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
57
58.
Реализации АТД список58
59.
Реализации АТД список• Односвязный список
– элемент имеет 0 или 1 соседа
• Развернутый список
59
60.
Реализации АТД список• Односвязный список
– элемент имеет 0 или 1 соседа
• Развернутый список
• Двусвязный список
– элемент имеет 1 или 2 соседей
• XOR-связный список
– элемент хранит xor адресов своих
соседей
– (a, b) -> (b, next(b)), (prev(a), a)
60
61.
Реализации АТД список• Односвязный список
• Двусвязный список
– элемент имеет 0 или 1 соседа
элемент
Голова
элемент
элемент
элемент
– элемент имеет 1 или 2 соседей
элемент
Хвост
• Развернутый список
• XOR-связный список
– элемент хранит xor адресов своих
соседей
– (a, b) -> (b, next(b)), (prev(a), a)
61
62.
Реализации АТД список• Односвязный список
• Двусвязный список
– элемент имеет 0 или 1 соседа
элемент
Голова
элемент
элемент
элемент
элемент
– элемент имеет 1 или 2 соседей
элемент
элемент
элемент
элемент
элемент
Хвост
• Развернутый список
• XOR-связный список
– элемент хранит xor адресов своих
соседей
– (a, b) -> (b, next(b)), (prev(a), a)
62
63.
Реализации АТД список• Односвязный список
• Двусвязный список
– элемент имеет 0 или 1 соседа
элемент
элемент
элемент
Голова
элемент
элемент
элемент
элемент
элемент
элемент
элемент
Хвост
• XOR-связный список
блок
элементов
блок
элементов
блок
элементов
блок
элементов
• Развернутый список
блок
элементов
– элемент имеет 1 или 2 соседей
– элемент хранит xor адресов своих
соседей
– (a, b) -> (b, next(b)), (prev(a), a)
63
64.
Реализации АТД список• Односвязный список
• Двусвязный список
– элемент имеет 0 или 1 соседа
элемент
элемент
элемент
Голова
элемент
элемент
элемент
элемент
элемент
элемент
элемент
Хвост
• XOR-связный список
блок
элементов
блок
элементов
блок
элементов
блок
элементов
• Развернутый список
блок
элементов
– элемент имеет 1 или 2 соседей
– элемент хранит xor адресов своих
соседей
– (prev(a), a) <- (a, b) -> (b, next(b))
64
65.
Описание АТД список на языке Си// TValue -- значения
// TList -- список TValue
// TItem -- элемент списка TValue
TList
void
TItem
TItem
TValue
void
TItem
void
void
MakeList(void);
DestroyList(TList list);
GetBegin(TList list);
GetEnd(TList list);
GetValue(TItem item);
SetValue(TItem item, TValue value);
GetNext(TItem item);
InsertAfter(TList* list, TItem item, TValue value);
RemoveAfter(TList* list, TItem item);
65
66.
Пример использования АТД список// Проверить присутствие значения в списке
int HasValue(TList list, TValue value) {
TItem item = GetBegin(list);
while (item != GetEnd(list) {
if (GetValue(item) == value) {
return 1;
}
item = GetNext(item);
}
return 0;
}
// Перепишите с помощью for
66
67.
Пример использования АТД список// Проверить присутствие значения в списке
int HasValue(TList list, TValue value) {
TItem item = GetBegin(list);
while (item != GetEnd(list) {
if (GetValue(item) == value) {
return 1;
}
item = GetNext(item);
}
return 0;
}
// Перепишите с помощью for
67
68.
Реализация через 1-связный списокstruct TList {
TValue Value;
struct TList* Next;
};
typedef struct TList* TList;
typedef struct TList* TItem;
68
69.
Реализация через 1-связный списокstruct TList {
TValue Value;
struct TList* Next;
};
typedef struct TList* TList;
typedef struct TList* TItem;
69
70.
Реализация через 1-связный списокstruct TList {
TValue Value;
struct TList* Next;
};
.Value
.Next
typedef struct TList* TList;
typedef struct TList* TItem;
70
71.
Реализация через 1-связный списокstruct TList {
TValue Value;
struct TList* Next;
};
.Value
.Next
typedef struct TList* TList;
typedef struct TList* TItem;
71
72.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
72
73.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
73
74.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
74
75.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
75
76.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
76
77.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
77
78.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
78
79.
Все операции, кроме InsertAfter и RemoveAfterTList MakeList(void) {
return NULL;
}
void DestroyList(TList list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetNext(TItem item) {
assert(item != NULL);
return item->Next;
}
TValue GetValue(TItem item) {
assert(item != NULL);
return item->Value;
}
void SetValue(TItem item, TValue value) {
assert(item != NULL);
item->Value = value;
}
TItem GetEnd(TList list) {
return NULL;
}
79
80.
Реализация InsertAftervoid InsertAfter(TList* list, TItem item, TValue value) {
TList new = malloc(sizeof *new);
assert(new != NULL);
new->Value = value;
if (item == NULL) { // вставка в начало
TList savedHead = *list;
*list = new;
new->Next = savedHead;
} else {
new->Next = item->Next;
item->Next = new;
}
}
80
81.
Вставка в 1-связный список в общем случаеitem
Value
Value
Next
Next
Value
Next
new
Value
Next
81
82.
Реализация RemoveAftervoid RemoveAfter(TList* list, TItem item) {
TItem itemToRemove = NULL;
if (item == NULL) { // удалить первый элемент
itemToRemove = *list;
*list = (*list)->Next;
} else {
itemToRemove = item->Next;
assert(itemToRemove != NULL);
item->Next = item->Next->Next;
}
free(itemToRemove);
}
// Напишите функцию void Remove(TList *list, TItem item);
82
83.
Удаление из 1-связного списка в общем случае83
84.
Удаление из 1-связного списка в общем случаеitem
itemToRemove
Value
Next
Value
Next
Value
Next
Из середины списка
*list itemToRemove
Value
Next
Value
Next
Из начала списка
84
85.
Удаление из 1-связного списка в общем случаеitem
itemToRemove
Value
Next
Value
Next
Value
Next
Из середины списка
*list itemToRemove
Value
Next
Value
Next
Из начала списка
85
86.
Реализация через 2-связный списокstruct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;
struct TDoublyLinkedList* Previous;
};
typedef struct TDoublyLinkedList* TDoublyLinkedList;
86
87.
Реализация через 2-связный списокstruct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;
struct TDoublyLinkedList* Previous;
};
typedef struct TDoublyLinkedList* TDoublyLinkedList;
87
88.
Реализация через 2-связный списокstruct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;
struct TDoublyLinkedList* Previous;
};
.Value
.Next
.Previous
typedef struct TDoublyLinkedList* TDoublyLinkedList;
88
89.
Реализация через 2-связный списокstruct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;
struct TDoublyLinkedList* Previous;
};
.Value
.Next
.Previous
typedef struct TDoublyLinkedList* TDoublyLinkedList;
89
90.
Удаление из 2-связного спискаTDoublyLinkedList q = p->Next;
p->Next->Next->Previous = p; // (1)
p->Next = q->Next;
// (2)
free(q);
p
q
(2)
next
next
value
prev
next
value
value
prev
prev
(1)
90
91.
Вставка в 2-связный списокp
next
next
value
next
value
prev
prev
value
prev
next
q
value
prev
TDoublyLinkedList q = malloc(sizeof *q);
assert(q != NULL);
p->Next->Previous = q; // (1)
q->Next = p->Next;
// (2)
p->Next = q;
// (3)
q->Previous = p;
// (4)
91
92.
АТД на основе списковЦиклический список
Стек (stack)
Очередь (queue)
Дек (double-ended queue, deque, двухголовая очередь)
92
93.
АТД на основе списковЦиклический список
Стек (stack)
Очередь (queue)
Дек (double-ended queue, deque, двухголовая очередь)
93
94.
АТД на основе списковЦиклический список
Стек (stack)
Очередь (queue)
Дек (double-ended queue, deque, двухголовая очередь)
94
95.
АТД циклический список• Последовательность с
конечным периодом
– отсутствие периода – частный
случай конечного периода
• Операции АТД список +
создание одноэлементного
цикла
• Реализация через 1-связные
списки с циклом
• Как определить наличие
периода, не изменяя список и
не используя дополнительной
памяти?
95
96.
АТД циклический список• Последовательность с
конечным периодом
– отсутствие периода – частный
случай конечного периода
• Операции АТД список +
создание одноэлементного
цикла
• Реализация через 1-связные
списки с циклом
• Как определить наличие
периода, не изменяя список и
не используя дополнительной
памяти?
96
97.
АТД циклический список• Последовательность с
конечным периодом
– отсутствие периода – частный
случай конечного периода
• Операции АТД список +
создание одноэлементного
цикла
• Реализация через 1-связные
списки с циклом
• Как определить наличие
периода, не изменяя список и
не используя дополнительной
памяти?
97
98.
АТД циклический список• Последовательность с
конечным периодом
– отсутствие периода – частный
случай конечного периода
• Операции АТД список +
создание одноэлементного
цикла
• Реализация через 1-связные
списки с циклом
• Как определить наличие
периода, не изменяя список и
не используя дополнительной
памяти?
98
99.
АТД циклический список• Последовательность с
конечным периодом
– отсутствие периода – частный
случай конечного периода
• Операции АТД список +
создание одноэлементного
цикла
• Реализация через 1-связные
списки с циклом
• Как определить наличие
периода, не изменяя список и
не используя дополнительной
памяти?
99
100.
АТД стек• Стек -- это список, в котором добавление/удаление элементов происходит
только на одном конце
• Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
100
101.
АТД стек• Стек -- это список, в котором добавление/удаление элементов происходит
только на одном конце
• Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
101
102.
АТД стек• Стек -- это список, в котором добавление/удаление элементов происходит
только на одном конце
• Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
102
103.
АТД стек• Стек -- это список, в котором добавление/удаление элементов происходит
только на одном конце
• Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
Вершина
103
104.
АТД стек• Стек -- это список, в котором добавление/удаление элементов происходит
только на одном конце
• Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
Вершина
104
105.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
105
106.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
106
107.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
107
108.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
108
109.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
109
110.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
110
111.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
111
112.
Операции со стекомОбозначение
CreateStack()
GetTop(S)
Pop(&S)
Действие
Выражение через АТД список
создать пустой стек
return MakeList();
вернуть вершину стека
return GetValue(GetBegin(S));
вернуть вершину и
удалить её
top = GetTop(*S);
RemoveAfter(S, NULL);
return top;
Push(&S, x)
добавить новый элемент x InsertAfter(S, NULL, x);
IsEmpty(S)
проверить наличие
элементов в стеке
DestroyStack(S) уничтожить стек
return GetBegin(S) == GetEnd(S);
DestroyList(S);
112
113.
Польская запись выражений113
114.
Польская запись выражений• Польская (бесскобочная,
постфиксная) запись
– afbc*zx–/–y+ar*k–/+
– «Программа» вычисления
арифметического выражения
• Как построить польскую запись?
Ян Лукашевич 1878-1956
– a + (f – b * c / (z – x) + y) / (a * r – k)
Польский логик, родился в г. Львов
• Скобочная (инфиксная) запись
114
115.
Польская запись выражений• Польская (бесскобочная,
постфиксная) запись
– afbc*zx–/–y+ar*k–/+
– «Программа» вычисления
арифметического выражения
• Как построить польскую запись?
Ян Лукашевич 1878-1956
– a + (f – b * c / (z – x) + y) / (a * r – k)
Польский логик, родился в г. Львов
• Скобочная (инфиксная) запись
115
116.
Польская запись выражений• Польская (бесскобочная,
постфиксная) запись
– afbc*zx–/–y+ar*k–/+
– «Программа» вычисления
арифметического выражения
• Как построить польскую запись?
Ян Лукашевич 1878-1956
– a + (f – b * c / (z – x) + y) / (a * r – k)
Польский логик, родился в г. Львов
• Скобочная (инфиксная) запись
116
117.
Польская запись выражений• Польская (бесскобочная,
постфиксная) запись
– afbc*zx–/–y+ar*k–/+
– «Программа» вычисления
арифметического выражения
• Как построить польскую запись?
Ян Лукашевич 1878-1956
– a + (f – b * c / (z – x) + y) / (a * r – k)
Польский логик, родился в г. Львов
• Скобочная (инфиксная) запись
117
118.
Построение польской записи• Вход: скобочная запись арифметического выражения
• Выход: польская запись того же арифметического выражения
Операция
+ –
* /
Приоритет
2
4
118
119.
Построение польской записи• Вход: скобочная запись арифметического выражения
• Выход: польская запись того же арифметического выражения
Операция
+ –
* /
Приоритет
2
4
119
120.
Построение польской записи• Вход: скобочная запись арифметического выражения
• Выход: польская запись того же арифметического выражения
Операция
+ –
* /
Приоритет
2
4
120
121.
Построение польской записи• Вход: скобочная запись арифметического выражения
• Выход: польская запись того же арифметического выражения
Операция
+ –
* /
Приоритет
2
4
121
122.
Сумма без скобок• скобочная = 1 + 2 – x + y – z – 5
• оператор = None, польская = «»
• пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
• польская += х
– если х – это + или –, то
• если оператор != None, то польская += оператор
• оператор = х
• польская += оператор
122
123.
Сумма произведений без скобокскобочная = 1 * 2 – x / y * z – 5
оператор1 = None, оператор2 = None, польская = «»
пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
польская += х
– если х – это * или /, то
если оператор1 == None, то оператор1 = х
если оператор1 – это * или /, то польская += оператор1, оператор1 = х
если оператор1 – это + или –, то оператор2 = оператор1, оператор1 = х
– если х – это + или –, то
если оператор1 == None, то оператор1 = х
если оператор1 – это + или –, то польская += оператор1, оператор1 = х
если оператор1 – это * или /, то
–
–
–
польская += оператор1
если оператор2 != None, то оператор1 = оператор2, оператор2 = None, польская += оператор1
оператор1 = х
польская += оператор1
если оператор2 != None, то польская += оператор2, оператор2 = None
123
124.
Сумма произведений без скобокскобочная = 1 * 2 – x / y * z – 5
оператор1 = None, оператор2 = None, польская = «»
пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
польская += х
– если х – это * или /, то
если оператор1 == None, то оператор1 = х
если оператор1 – это * или /, то польская += оператор1, оператор1 = х
если оператор1 – это + или –, то оператор2 = оператор1, оператор1 = х
– если х – это + или –, то
если оператор1 == None, то оператор1 = х
если оператор1 – это + или –, то польская += оператор1, оператор1 = х
если оператор1 – это * или /, то
–
–
–
польская += оператор1
если оператор2 != None, то оператор1 = оператор2, оператор2 = None, польская += оператор1
оператор1 = х
польская += оператор1
если оператор2 != None, то польская += оператор2, оператор2 = None
скобочная
польская
о1 о2
1*2-x/y*z-5
*2-x/y*z-5 1
2-x/y*z-5 1
-x/y*z-5 12
x/y*z-5 12*
*
*
-
/y*z-5 12*x
-
y*z-5 12*x
/
-
/
-
*
-
*
-
*z-5 12*xy
z-5 12*xy/
-5 12*xy/z
5 12*xy/z*12*xy/z*-5
-
12*xy/z*-5124
125.
Сумма произведений без скобокскобочная = 1 * 2 – x / y * z – 5
оператор1 = None, оператор2 = None, польская = «»
пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
польская += х
– если х – это * или /, то
если оператор1 == None, то оператор1 = х
если оператор1 – это * или /, то польская += оператор1, оператор1 = х
если оператор1 – это + или –, то оператор2 = оператор1, оператор1 = х
– если х – это + или –, то
если оператор1 == None, то оператор1 = х
если оператор1 – это + или –, то польская += оператор1, оператор1 = х
если оператор1 – это * или /, то
–
–
–
польская += оператор1
если оператор2 != None, то оператор1 = оператор2, оператор2 = None, польская += оператор1
оператор1 = х
польская += оператор1
если оператор2 != None, то польская += оператор2, оператор2 = None
125
126.
Сумма произведений без скобок со стекомскобочная = 1 * 2 – x / y * z – 5
операторы = CreateStack(), польская = «»
пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
польская += х
– если х – это * или /, то
если IsEmpty(операторы), то Push(&операторы, х)
иначе если GetTop(операторы) – это * или /, то польская += Pop(&операторы), Push(&операторы, х)
иначе если GetTop(операторы) – это + или –, то Push(&операторы, х)
– если х – это + или –, то
если IsEmpty(операторы), то Push(&операторы, х)
иначе если GetTop(операторы) – это + или –, то польская += Pop(&операторы), Push(&операторы, х)
иначе если GetTop(операторы) – это * или /, то
–
–
–
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
Push(&операторы, х)
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
126
127.
Сумма произведений без скобок со стекомскобочная = 1 * 2 – x / y * z – 5
операторы = CreateStack(), польская = «»
пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
польская += х
– если х – это * или /, то
если ! IsEmpty(операторы), то
–
–
если GetTop(операторы) – это * или /, то польская += Pop(&операторы)
если GetTop(операторы) – это + или –, то ничего не делать
– если х – это + или –, то
если ! IsEmpty(операторы), то
–
–
если GetTop(операторы) – это + или –, то польская += Pop(&операторы)
если GetTop(операторы) – это * или /, то
» польская += Pop(&операторы)
» если ! IsEmpty(операторы), то польская += Pop(&операторы)
– Push(&операторы, х)
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
127
128.
Сумма произведений без скобок со стеком• скобочная = 1 * 2 – x / y * z – 5
• операторы = CreateStack(), польская = «»
• пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
• польская += х
– если х – это * или /, то
• если ! IsEmpty(операторы), то
– если GetTop(операторы) – это * или /, то польская += Pop(&операторы)
– если GetTop(операторы) – это + или –, то ничего не делать
– если х – это + или –, то
• пока ! IsEmpty(операторы)
– польская += Pop(&операторы)
– Push(&операторы, х)
• польская += Pop(&операторы)
• если ! IsEmpty(операторы), то польская += Pop(&операторы)
128
129.
Сумма произведений без скобок со стеком• скобочная = 1 * 2 – x / y * z – 5
• операторы = CreateStack(), польская = «»
• пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
• польская += х
– если х – это * или /, то
• пока ! IsEmpty(операторы) и GetTop(операторы) – это * или /
– польская += Pop(&операторы)
– если х – это + или –, то
• пока ! IsEmpty(операторы)
– польская += Pop(&операторы)
– Push(&операторы, х)
• польская += Pop(&операторы)
• если ! IsEmpty(операторы), то польская += Pop(&операторы)
129
130.
Сумма произведений без скобок со стеком• скобочная = 1 * 2 – x / y * z – 5
• операторы = CreateStack(), польская = «»
• пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
• польская += х
– иначе
• пока ! IsEmpty(операторы) и приоритет(GetTop(операторы)) >= приоритет(x)
– польская += Pop(&операторы)
• Push(&операторы, х)
• польская += Pop(&операторы)
• если ! IsEmpty(операторы), то польская += Pop(&операторы)
130
131.
Сумма произведений без скобок со стеком• скобочная = 1 * 2 – x / y * z – 5
• операторы = CreateStack(), польская = «»
• пока скобочная != «»
– х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
– если х – это число или переменная, то
• польская += х
– иначе
• пока ! IsEmpty(операторы) и приоритет(GetTop(операторы)) >= приоритет(x)
– польская += Pop(&операторы)
• Push(&операторы, х)
• пока ! IsEmpty(операторы)
– польская += Pop(&операторы)
131
132.
Построение польской записиоператоры = CreateStack(), польская = «»
пока скобочная != «» повторять
х = первая лексема скобочная, удалить х из скобочная
если х – число или переменная, то польская += х
иначе если х = (, то Push(&операторы, х)
иначе если х = ), то
пока GetTop(операторы) != ( повторять
польская += Pop(&операторы)
Pop(&операторы) // убрать саму (
иначе
пока !IsEmpty(операторы) && П(GetTop(операторы)) >= П(х) повторять
польская += Pop(&операторы)
Push(&операторы, х)
пока !IsEmpty(операторы) повторять польская += Pop(&операторы)
DestroyStack(операторы)
132
133.
Построение польской записиоператоры = CreateStack(), польская = «»
пока скобочная != «» повторять
х = первая лексема скобочная, удалить х из скобочная
если х – число или переменная, то польская += х
для удобства
иначе если х = (, то Push(&операторы, х)
считаем П(() <
приоритет любой
иначе если х = ), то
операции
пока GetTop(операторы) != ( повторять
польская += Pop(&операторы)
Pop(&операторы) // убрать саму (
иначе
пока !IsEmpty(операторы) && П(GetTop(операторы)) >= П(х) повторять
польская += Pop(&операторы)
Push(&операторы, х)
пока !IsEmpty(операторы) повторять польская += Pop(&операторы)
DestroyStack(операторы)
133
134.
Примерa + ( f − b * c / ( z − x ) + y ) / ( a * r − k )
Стек:
X=
Выходная строка:
134
135.
Вычисление по польской записиоперанды = CreateStack()
пока польская != «» повторять
х = первый элемент польская, удалить х из польская
если х – число или переменная, то
Push(&операнды, значение(х))
если х – оператор, то
a = Pop(&операнды)
b = Pop(&операнды)
Push(&операнды, a x b)
значениеПольской = Pop(&операнды)
Destroy(операнды)
135
136.
ПримерВходная строка:
5 2 3 * 4 2 / - 4 / + 1 Стек:
0 5
1
2
3
4
=
6
1
4
2
136
137.
Заключение• Абстрактные типы данных
– Несколько примеров
– Определение
– Зачем использовать АТД
• АТД список
– Реализация на языке Си через 1-связные списки
• АТД на основе списков
– Стек, очередь, дек
• Примеры использования стека
– Построение польской записи арифметического выражения
– Вычисление значения польской записи на стеке
137