Cписок и другие абстрактные типы данных

Содержание

Слайд 2

Слайд 3

План лекции Абстрактные типы данных Несколько примеров Определение Зачем использовать АТД

План лекции

Абстрактные типы данных
Несколько примеров
Определение
Зачем использовать АТД
АТД список
Реализация на языке Си

через 1-связные списки
АТД на основе списков
Примеры использования стека
Построение польской записи арифметического выражения
Вычисление значения польской записи на стеке
Слайд 4

Кто придумал абстрактные типы данных?

Кто придумал абстрактные типы данных?

Слайд 5

Кто придумал абстрактные типы данных? Барбара Лисков р. 1939 Стивен Жиль

Кто придумал абстрактные типы данных?

Барбара Лисков р. 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

Слайд 6

Кто придумал абстрактные типы данных? Барбара Лисков р. 1939 Стивен Жиль

Кто придумал абстрактные типы данных?

Барбара Лисков р. 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

Слайд 7

Кто придумал абстрактные типы данных? Барбара Лисков р. 1939 Стивен Жиль

Кто придумал абстрактные типы данных?

Барбара Лисков р. 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

Слайд 8

Примеры АТД Система регулирования скорости Задать скорость Получить текущие параметры Восстановить

Примеры АТД

Система регулирования скорости
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение

скорости
Отключить систему

Кофемолка
Включить
Выключить
Задать скорость
Начать перемалывание
Прекратить перемалывание

Слайд 9

Примеры АТД Система регулирования скорости Задать скорость Получить текущие параметры Восстановить

Примеры АТД

Система регулирования скорости
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение

скорости
Отключить систему

Кофемолка
Включить
Выключить
Задать скорость
Начать перемалывание
Прекратить перемалывание

By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1086183

Слайд 10

Примеры АТД Система регулирования скорости Задать скорость Получить текущие параметры Восстановить

Примеры АТД

Система регулирования скорости
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение

скорости
Отключить систему

Кофемолка
Включить
Выключить
Задать скорость
Начать перемалывание
Прекратить перемалывание

By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1086183

Слайд 11

Примеры АТД Система регулирования скорости Задать скорость Получить текущие параметры Восстановить

Примеры АТД

Система регулирования скорости
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение

скорости
Отключить систему

Кофемолка
Включить
Выключить
Задать скорость
Начать перемалывание
Прекратить перемалывание

By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1086183

Слайд 12

Примеры АТД Система регулирования скорости Задать скорость Получить текущие параметры Восстановить

Примеры АТД

Система регулирования скорости
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение

скорости
Отключить систему

Кофемолка
Включить
Выключить
Задать скорость
Начать перемалывание
Прекратить перемалывание

By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1086183

Слайд 13

Примеры АТД Система регулирования скорости Задать скорость Получить текущие параметры Восстановить

Примеры АТД

Система регулирования скорости
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение

скорости
Отключить систему

Кофемолка
Включить
Выключить
Задать скорость
Начать перемалывание
Прекратить перемалывание

By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1086183

Слайд 14

Примеры АТД Система регулирования скорости Задать скорость Получить текущие параметры Восстановить

Примеры АТД

Система регулирования скорости
Задать скорость
Получить текущие параметры
Восстановить предыдущее значение

скорости
Отключить систему

Кофемолка
Включить
Выключить
Задать скорость
Начать перемалывание
Прекратить перемалывание

By User Sav127 on en.wikipedia - Sav127, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1086183

Слайд 15

Примеры АТД Топливный бак Заполнить бак Слить топливо Получить емкость топливного

Примеры АТД

Топливный бак
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака

Список
Инициализировать

список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
Слайд 16

Примеры АТД Топливный бак Заполнить бак Слить топливо Получить емкость топливного

Примеры АТД

Топливный бак
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака

Список
Инициализировать

список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
Слайд 17

Примеры АТД Топливный бак Заполнить бак Слить топливо Получить емкость топливного

Примеры АТД

Топливный бак
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака

Список
Инициализировать

список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
Слайд 18

Примеры АТД Топливный бак Заполнить бак Слить топливо Получить емкость топливного

Примеры АТД

Топливный бак
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака

Список
Инициализировать

список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
Слайд 19

Примеры АТД Топливный бак Заполнить бак Слить топливо Получить емкость топливного

Примеры АТД

Топливный бак
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака

Список
Инициализировать

список
Вставить элемент
Удалить элемент
Прочитать следующий элемент
Слайд 20

Примеры АТД Топливный бак Заполнить бак Слить топливо Получить емкость топливного

Примеры АТД

Топливный бак
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака

Список
Создать/уничтожить

список
Вставить/удалить/изменить элемент
Навигация по элементам
Слайд 21

Примеры АТД Топливный бак Заполнить бак Слить топливо Получить емкость топливного

Примеры АТД

Топливный бак
Заполнить бак
Слить топливо
Получить емкость топливного бака
Получить статус топливного бака

Список
Создать/уничтожить

список
Вставить/удалить/изменить элемент
Навигация по элементам
Слайд 22

Примеры АТД Фонарь Включить Выключить Стек Инициализировать стек Поместить элемент Извлечь элемент Проверить наличие элементов

Примеры АТД

Фонарь
Включить
Выключить

Стек
Инициализировать стек
Поместить элемент
Извлечь элемент
Проверить наличие элементов

Слайд 23

Примеры АТД Фонарь Включить Выключить Стек Инициализировать стек Поместить элемент Извлечь элемент Проверить наличие элементов

Примеры АТД

Фонарь
Включить
Выключить

Стек
Инициализировать стек
Поместить элемент
Извлечь элемент
Проверить наличие элементов

Слайд 24

Примеры АТД Фонарь Включить Выключить Стек Инициализировать стек Поместить элемент Извлечь элемент Проверить наличие элементов

Примеры АТД

Фонарь
Включить
Выключить

Стек
Инициализировать стек
Поместить элемент
Извлечь элемент
Проверить наличие элементов

Слайд 25

Примеры АТД Фонарь Включить Выключить Стек Инициализировать стек Поместить элемент Извлечь элемент Проверить наличие элементов

Примеры АТД

Фонарь
Включить
Выключить

Стек
Инициализировать стек
Поместить элемент
Извлечь элемент
Проверить наличие элементов

Слайд 26

Примеры АТД Фонарь Включить Выключить Стек Инициализировать стек Поместить элемент Извлечь элемент Проверить наличие элементов

Примеры АТД

Фонарь
Включить
Выключить

Стек
Инициализировать стек
Поместить элемент
Извлечь элемент
Проверить наличие элементов

Слайд 27

Примеры АТД Фонарь Включить Выключить Стек Инициализировать стек Поместить элемент Извлечь элемент Проверить наличие элементов

Примеры АТД

Фонарь
Включить
Выключить

Стек
Инициализировать стек
Поместить элемент
Извлечь элемент
Проверить наличие элементов

Слайд 28

Примеры АТД Фонарь Включить Выключить Стек Инициализировать стек Поместить элемент Извлечь элемент Проверить наличие элементов

Примеры АТД

Фонарь
Включить
Выключить

Стек
Инициализировать стек
Поместить элемент
Извлечь элемент
Проверить наличие элементов

Слайд 29

Примеры АТД Указатель Выделить блок памяти Освободить блок памяти Изменить объем

Примеры АТД

Указатель
Выделить блок памяти
Освободить блок памяти
Изменить объем выделенной памяти

Файл
Открыть
Прочитать байты
Записать байты
Установить

позицию чтения/записи
Закрыть
Слайд 30

Примеры АТД Указатель Выделить блок памяти Освободить блок памяти Изменить объем

Примеры АТД

Указатель
Выделить блок памяти
Освободить блок памяти
Изменить объем выделенной памяти

Файл
Открыть
Прочитать байты
Записать байты
Установить

позицию чтения/записи
Закрыть
Слайд 31

Примеры АТД Указатель Выделить блок памяти Освободить блок памяти Изменить объем

Примеры АТД

Указатель
Выделить блок памяти
Освободить блок памяти
Изменить объем выделенной памяти

Файл
Открыть
Прочитать байты
Записать байты
Установить

позицию чтения/записи
Закрыть
Слайд 32

Примеры АТД Указатель Выделить блок памяти Освободить блок памяти Изменить объем

Примеры АТД

Указатель
Выделить блок памяти
Освободить блок памяти
Изменить объем выделенной памяти

Файл
Открыть
Прочитать байты
Записать байты
Установить

позицию чтения/записи
Закрыть
Слайд 33

Примеры АТД Указатель Выделить блок памяти Освободить блок памяти Изменить объем

Примеры АТД

Указатель
Выделить блок памяти
Освободить блок памяти
Изменить объем выделенной памяти

Файл
Открыть
Прочитать байты
Записать байты
Установить

позицию чтения/записи
Закрыть
Слайд 34

Определение АТД Абстрактный тип данных – это множество значений и набор

Определение АТД

Абстрактный тип данных – это множество значений и набор операций,

для которых не важно представление этих значений в памяти
АТД – это семейство обычных типов данных, которые используются и ведут себя одинаково
Реализация АТД – это один из обычных типов данных, принадлежащих семейству, которое задает АТД
Конкретный набор подпрограмм, выполняющих операции над конкретными значениями в памяти
Один АТД может допускать несколько принципиально разных реализаций
Слайд 35

Определение АТД Абстрактный тип данных – это множество значений и набор

Определение АТД

Абстрактный тип данных – это множество значений и набор операций,

для которых не важно представление этих значений в памяти
АТД – это семейство обычных типов данных, которые используются и ведут себя одинаково
Реализация АТД – это один из обычных типов данных, принадлежащих семейству, которое задает АТД
Конкретный набор подпрограмм, выполняющих операции над конкретными значениями в памяти
Один АТД может допускать несколько принципиально разных реализаций
Слайд 36

Определение АТД Абстрактный тип данных – это множество значений и набор

Определение АТД

Абстрактный тип данных – это множество значений и набор операций,

для которых не важно представление этих значений в памяти
АТД – это семейство обычных типов данных, которые используются и ведут себя одинаково
Реализация АТД – это один из обычных типов данных, принадлежащих семейству, которое задает АТД
Конкретный набор подпрограмм, выполняющих операции над конкретными значениями в памяти
Один АТД может допускать несколько принципиально разных реализаций
Слайд 37

Определение АТД Абстрактный тип данных – это множество значений и набор

Определение АТД

Абстрактный тип данных – это множество значений и набор операций,

для которых не важно представление этих значений в памяти
АТД – это семейство обычных типов данных, которые используются и ведут себя одинаково
Реализация АТД – это один из обычных типов данных, принадлежащих семейству, которое задает АТД
Конкретный набор подпрограмм, выполняющих операции над конкретными значениями в памяти
Один АТД может допускать несколько принципиально разных реализаций
Слайд 38

Определение АТД Абстрактный тип данных – это множество значений и набор

Определение АТД

Абстрактный тип данных – это множество значений и набор операций,

для которых не важно представление этих значений в памяти
АТД – это семейство обычных типов данных, которые используются и ведут себя одинаково
Реализация АТД – это один из обычных типов данных, принадлежащих семейству, которое задает АТД
Конкретный набор подпрограмм, выполняющих операции над конкретными значениями в памяти
Один АТД может допускать несколько принципиально разных реализаций
Слайд 39

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 40

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 41

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 42

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 43

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 44

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 45

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 46

Контейнеры Контейнер – это АТД, использующийся для группировки элементов и доступа к ним

Контейнеры

Контейнер – это АТД, использующийся для группировки элементов и доступа к

ним
Слайд 47

Зачем использовать АТД? Реализация АТД Скрываем детали реализации Упрощаем оптимизацию кода

Зачем использовать АТД?

Реализация АТД
Скрываем детали реализации
Упрощаем оптимизацию кода
Ограничиваем область использования данных
Ограничиваем

область изменений в коде

Использование АТД
Пишем более понятно
Работаем с сущностями решаемой задаи
А не с деталями реализации

Слайд 48

Зачем использовать АТД? Реализация АТД Скрываем детали реализации Упрощаем оптимизацию кода

Зачем использовать АТД?

Реализация АТД
Скрываем детали реализации
Упрощаем оптимизацию кода
Ограничиваем область использования данных
Ограничиваем

область изменений в коде

Использование АТД
Пишем более понятно
Работаем с сущностями решаемой задаи
А не с деталями реализации

Слайд 49

Зачем использовать АТД? Реализация АТД Скрываем детали реализации Упрощаем оптимизацию кода

Зачем использовать АТД?

Реализация АТД
Скрываем детали реализации
Упрощаем оптимизацию кода
Ограничиваем область использования данных
Ограничиваем

область изменений в коде

Использование АТД
Пишем более понятно
Работаем с сущностями решаемой задаи
А не с деталями реализации

Слайд 50

Зачем использовать АТД? Реализация АТД Скрываем детали реализации Упрощаем оптимизацию кода

Зачем использовать АТД?

Реализация АТД
Скрываем детали реализации
Упрощаем оптимизацию кода
Ограничиваем область использования данных
Ограничиваем

область изменений в коде

Использование АТД
Пишем более понятно
Про сущности решаемой задачи, а не про детали реализации
Решаем задачу независимо от реализации АТД

Слайд 51

АТД список Конечная последовательность элементов Создать пустой список Уничтожить список Получить

АТД список

Конечная последовательность элементов
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент»

списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
Слайд 52

АТД список Конечная последовательность элементов Создать пустой список Уничтожить список Получить

АТД список

Конечная последовательность элементов
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент»

списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
Слайд 53

АТД список Конечная последовательность элементов Создать пустой список Уничтожить список Получить

АТД список

Конечная последовательность элементов
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент»

списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
Слайд 54

АТД список Конечная последовательность элементов Создать пустой список Уничтожить список Получить

АТД список

Конечная последовательность элементов
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент»

списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
Слайд 55

АТД список Конечная последовательность элементов Создать пустой список Уничтожить список Получить

АТД список

Конечная последовательность элементов
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент»

списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
Слайд 56

АТД список Конечная последовательность элементов Создать пустой список Уничтожить список Получить

АТД список

Конечная последовательность элементов
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент»

списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
Слайд 57

АТД список Конечная последовательность элементов Создать пустой список Уничтожить список Получить

АТД список

Конечная последовательность элементов
Создать пустой список
Уничтожить список
Получить первый элемент списка
Получить «элемент»

списка, следующий за последним элементом
Получить значение элемента списка
Изменить значение элемента списка
Получить элемент, следующий за данным
Добавить элемент после данного элемента
Удалить данный элемент
Слайд 58

Реализации АТД список

Реализации АТД список

Слайд 59

Реализации АТД список Односвязный список элемент имеет 0 или 1 соседа Развернутый список

Реализации АТД список

Односвязный список
элемент имеет 0 или 1 соседа
Развернутый список

Слайд 60

Реализации АТД список Односвязный список элемент имеет 0 или 1 соседа

Реализации АТД список

Односвязный список
элемент имеет 0 или 1 соседа
Развернутый список

Двусвязный список
элемент

имеет 1 или 2 соседей
XOR-связный список
элемент хранит xor адресов своих соседей
(a, b) -> (b, next(b)), (prev(a), a)
Слайд 61

Реализации АТД список Односвязный список элемент имеет 0 или 1 соседа

Реализации АТД список

Односвязный список
элемент имеет 0 или 1 соседа
Развернутый список

Двусвязный список
элемент

имеет 1 или 2 соседей
XOR-связный список
элемент хранит xor адресов своих соседей
(a, b) -> (b, next(b)), (prev(a), a)
Слайд 62

Реализации АТД список Односвязный список элемент имеет 0 или 1 соседа

Реализации АТД список

Односвязный список
элемент имеет 0 или 1 соседа
Развернутый список

Двусвязный список
элемент

имеет 1 или 2 соседей
XOR-связный список
элемент хранит xor адресов своих соседей
(a, b) -> (b, next(b)), (prev(a), a)
Слайд 63

Реализации АТД список Односвязный список элемент имеет 0 или 1 соседа

Реализации АТД список

Односвязный список
элемент имеет 0 или 1 соседа
Развернутый список

Двусвязный список
элемент

имеет 1 или 2 соседей
XOR-связный список
элемент хранит xor адресов своих соседей
(a, b) -> (b, next(b)), (prev(a), a)
Слайд 64

Реализации АТД список Односвязный список элемент имеет 0 или 1 соседа

Реализации АТД список

Односвязный список
элемент имеет 0 или 1 соседа
Развернутый список

Двусвязный список
элемент

имеет 1 или 2 соседей
XOR-связный список
элемент хранит xor адресов своих соседей
(prev(a), a) <- (a, b) -> (b, next(b))
Слайд 65

Описание АТД список на языке Си // TValue -- значения //

Описание АТД список на языке Си

// TValue -- значения
// TList --

список TValue
// TItem -- элемент списка TValue
TList MakeList(void);
void DestroyList(TList list);
TItem GetBegin(TList list);
TItem GetEnd(TList list);
TValue GetValue(TItem item);
void SetValue(TItem item, TValue value);
TItem GetNext(TItem item);
void InsertAfter(TList* list, TItem item, TValue value);
void RemoveAfter(TList* list, TItem item);
Слайд 66

Пример использования АТД список // Проверить присутствие значения в списке int

Пример использования АТД список

// Проверить присутствие значения в списке
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

Пример использования АТД список // Проверить присутствие значения в списке int

Пример использования АТД список

// Проверить присутствие значения в списке
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
Слайд 68

Реализация через 1-связный список struct TList { TValue Value; struct TList*

Реализация через 1-связный список

struct TList {
TValue Value;
struct TList* Next;
};
typedef

struct TList* TList;
typedef struct TList* TItem;
Слайд 69

Реализация через 1-связный список struct TList { TValue Value; struct TList*

Реализация через 1-связный список

struct TList {
TValue Value;
struct TList* Next;
};
typedef

struct TList* TList;
typedef struct TList* TItem;
Слайд 70

Реализация через 1-связный список struct TList { TValue Value; struct TList*

Реализация через 1-связный список

struct TList {
TValue Value;
struct TList* Next;
};
typedef

struct TList* TList;
typedef struct TList* TItem;
Слайд 71

Реализация через 1-связный список struct TList { TValue Value; struct TList*

Реализация через 1-связный список

struct TList {
TValue Value;
struct TList* Next;
};
typedef

struct TList* TList;
typedef struct TList* TItem;
Слайд 72

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 73

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 74

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 75

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 76

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 77

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 78

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 79

Все операции, кроме InsertAfter и RemoveAfter TList MakeList(void) { return NULL;

Все операции, кроме InsertAfter и RemoveAfter

TList MakeList(void) {
return NULL;
}
void DestroyList(TList

list) {
while (GetBegin(list) != GetEnd(list)) {
Remove(&list, GetBegin(list));
}
}
TItem GetBegin(TList list) {
return list;
}
TItem GetEnd(TList list) {
return NULL;
}

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;
}

Слайд 80

Реализация InsertAfter void InsertAfter(TList* list, TItem item, TValue value) { TList

Реализация InsertAfter

void 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;
    }
}

Слайд 81

Вставка в 1-связный список в общем случае Value Value Value new

Вставка в 1-связный список в общем случае

Value

Value

Value

new

Next

item

Next

Next

Value

Next

Слайд 82

Реализация RemoveAfter void RemoveAfter(TList* list, TItem item) { TItem itemToRemove =

Реализация RemoveAfter

void 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);

Слайд 83

Удаление из 1-связного списка в общем случае

Удаление из 1-связного списка в общем случае

Слайд 84

Удаление из 1-связного списка в общем случае *list itemToRemove Value Next

Удаление из 1-связного списка в общем случае

*list itemToRemove

Value

Next

Value

Next

Value

Next

Value

Next

Value

Next

Из середины списка

Из начала

списка

item itemToRemove

Слайд 85

Удаление из 1-связного списка в общем случае *list itemToRemove Value Next

Удаление из 1-связного списка в общем случае

*list itemToRemove

Value

Next

Value

Next

Value

Next

Value

Next

Value

Next

Из середины списка

Из начала

списка

item itemToRemove

Слайд 86

Реализация через 2-связный список struct TDoublyLinkedList { TValue Value; struct TDoublyLinkedList*

Реализация через 2-связный список

struct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;

struct TDoublyLinkedList* Previous;
};
typedef struct TDoublyLinkedList* TDoublyLinkedList;
Слайд 87

Реализация через 2-связный список struct TDoublyLinkedList { TValue Value; struct TDoublyLinkedList*

Реализация через 2-связный список

struct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;

struct TDoublyLinkedList* Previous;
};
typedef struct TDoublyLinkedList* TDoublyLinkedList;
Слайд 88

Реализация через 2-связный список struct TDoublyLinkedList { TValue Value; struct TDoublyLinkedList*

Реализация через 2-связный список

struct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;

struct TDoublyLinkedList* Previous;
};
typedef struct TDoublyLinkedList* TDoublyLinkedList;

.Previous

Слайд 89

Реализация через 2-связный список struct TDoublyLinkedList { TValue Value; struct TDoublyLinkedList*

Реализация через 2-связный список

struct TDoublyLinkedList {
TValue Value;
struct TDoublyLinkedList* Next;

struct TDoublyLinkedList* Previous;
};
typedef struct TDoublyLinkedList* TDoublyLinkedList;

.Previous

Слайд 90

Удаление из 2-связного списка TDoublyLinkedList q = p->Next; p->Next->Next->Previous = p;

Удаление из 2-связного списка

TDoublyLinkedList q = p->Next;
p->Next->Next->Previous = p;

// (1)
p->Next = q->Next; // (2)
free(q);

value

value

value

prev

next

next

next

prev

prev

p

q

(2)

(1)

Слайд 91

Вставка в 2-связный список TDoublyLinkedList q = malloc(sizeof *q); assert(q !=

Вставка в 2-связный список


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)

value

next

prev

p

value

next

prev

value

next

prev

value

next

prev

q

Слайд 92

АТД на основе списков Циклический список Стек (stack) Очередь (queue) Дек (double-ended queue, deque, двухголовая очередь)

АТД на основе списков

Циклический список
Стек (stack)
Очередь (queue)
Дек (double-ended queue, deque, двухголовая

очередь)
Слайд 93

АТД на основе списков Циклический список Стек (stack) Очередь (queue) Дек (double-ended queue, deque, двухголовая очередь)

АТД на основе списков

Циклический список
Стек (stack)
Очередь (queue)
Дек (double-ended queue, deque, двухголовая

очередь)
Слайд 94

АТД на основе списков Циклический список Стек (stack) Очередь (queue) Дек (double-ended queue, deque, двухголовая очередь)

АТД на основе списков

Циклический список
Стек (stack)
Очередь (queue)
Дек (double-ended queue, deque, двухголовая

очередь)
Слайд 95

АТД циклический список Последовательность с конечным периодом отсутствие периода – частный

АТД циклический список

Последовательность с конечным периодом
отсутствие периода – частный случай конечного

периода
Операции АТД список + создание одноэлементного цикла

Реализация через 1-связные списки с циклом
Как определить наличие периода, не изменяя список и не используя дополнительной памяти?

Слайд 96

АТД циклический список Последовательность с конечным периодом отсутствие периода – частный

АТД циклический список

Последовательность с конечным периодом
отсутствие периода – частный случай конечного

периода
Операции АТД список + создание одноэлементного цикла

Реализация через 1-связные списки с циклом
Как определить наличие периода, не изменяя список и не используя дополнительной памяти?

Слайд 97

АТД циклический список Последовательность с конечным периодом отсутствие периода – частный

АТД циклический список

Последовательность с конечным периодом
отсутствие периода – частный случай конечного

периода
Операции АТД список + создание одноэлементного цикла

Реализация через 1-связные списки с циклом
Как определить наличие периода, не изменяя список и не используя дополнительной памяти?

Слайд 98

АТД циклический список Последовательность с конечным периодом отсутствие периода – частный

АТД циклический список

Последовательность с конечным периодом
отсутствие периода – частный случай конечного

периода
Операции АТД список + создание одноэлементного цикла

Реализация через 1-связные списки с циклом
Как определить наличие периода, не изменяя список и не используя дополнительной памяти?

Слайд 99

АТД циклический список Последовательность с конечным периодом отсутствие периода – частный

АТД циклический список

Последовательность с конечным периодом
отсутствие периода – частный случай конечного

периода
Операции АТД список + создание одноэлементного цикла

Реализация через 1-связные списки с циклом
Как определить наличие периода, не изменяя список и не используя дополнительной памяти?

Слайд 100

АТД стек Стек -- это список, в котором добавление/удаление элементов происходит

АТД стек

Стек -- это список, в котором добавление/удаление элементов происходит только

на одном конце
Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
Слайд 101

АТД стек Стек -- это список, в котором добавление/удаление элементов происходит

АТД стек

Стек -- это список, в котором добавление/удаление элементов происходит только

на одном конце
Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
Слайд 102

АТД стек Стек -- это список, в котором добавление/удаление элементов происходит

АТД стек

Стек -- это список, в котором добавление/удаление элементов происходит только

на одном конце
Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
Слайд 103

АТД стек Стек -- это список, в котором добавление/удаление элементов происходит

АТД стек

Стек -- это список, в котором добавление/удаление элементов происходит только

на одном конце
Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
Слайд 104

АТД стек Стек -- это список, в котором добавление/удаление элементов происходит

АТД стек

Стек -- это список, в котором добавление/удаление элементов происходит только

на одном конце
Последний добавленный в стек элемент называется вершиной стека
реверсивная память
гнездовая память
магазин
push-down список
LIFO (last-in-first-out)
список йо-йо
Слайд 105

Операции со стеком

Операции со стеком

Слайд 106

Операции со стеком

Операции со стеком

Слайд 107

Операции со стеком

Операции со стеком

Слайд 108

Операции со стеком

Операции со стеком

Слайд 109

Операции со стеком

Операции со стеком

Слайд 110

Операции со стеком

Операции со стеком

Слайд 111

Операции со стеком

Операции со стеком

Слайд 112

Операции со стеком

Операции со стеком

Слайд 113

Польская запись выражений

Польская запись выражений

Слайд 114

Польская запись выражений Скобочная (инфиксная) запись a + (f – b

Польская запись выражений

Скобочная (инфиксная) запись
a + (f – b * c

/ (z – x) + y) / (a * r – k)
Польская (бесскобочная, постфиксная) запись
a f b c * z x – / – y + a r * k – / +
«Программа» вычисления арифметического выражения
Как построить польскую запись?

Ян Лукашевич 1878-1956
Польский логик, родился в г. Львов

Слайд 115

Польская запись выражений Скобочная (инфиксная) запись a + (f – b

Польская запись выражений

Скобочная (инфиксная) запись
a + (f – b * c

/ (z – x) + y) / (a * r – k)
Польская (бесскобочная, постфиксная) запись
a f b c * z x – / – y + a r * k – / +
«Программа» вычисления арифметического выражения
Как построить польскую запись?

Ян Лукашевич 1878-1956
Польский логик, родился в г. Львов

Слайд 116

Польская запись выражений Скобочная (инфиксная) запись a + (f – b

Польская запись выражений

Скобочная (инфиксная) запись
a + (f – b * c

/ (z – x) + y) / (a * r – k)
Польская (бесскобочная, постфиксная) запись
a f b c * z x – / – y + a r * k – / +
«Программа» вычисления арифметического выражения
Как построить польскую запись?

Ян Лукашевич 1878-1956
Польский логик, родился в г. Львов

Слайд 117

Польская запись выражений Скобочная (инфиксная) запись a + (f – b

Польская запись выражений

Скобочная (инфиксная) запись
a + (f – b * c

/ (z – x) + y) / (a * r – k)
Польская (бесскобочная, постфиксная) запись
a f b c * z x – / – y + a r * k – / +
«Программа» вычисления арифметического выражения
Как построить польскую запись?

Ян Лукашевич 1878-1956
Польский логик, родился в г. Львов

Слайд 118

Вход: скобочная запись арифметического выражения Выход: польская запись того же арифметического выражения Построение польской записи

Вход: скобочная запись арифметического выражения
Выход: польская запись того же арифметического выражения

Построение

польской записи
Слайд 119

Вход: скобочная запись арифметического выражения Выход: польская запись того же арифметического выражения Построение польской записи

Вход: скобочная запись арифметического выражения
Выход: польская запись того же арифметического выражения

Построение

польской записи
Слайд 120

Вход: скобочная запись арифметического выражения Выход: польская запись того же арифметического выражения Построение польской записи

Вход: скобочная запись арифметического выражения
Выход: польская запись того же арифметического выражения

Построение

польской записи
Слайд 121

Вход: скобочная запись арифметического выражения Выход: польская запись того же арифметического выражения Построение польской записи

Вход: скобочная запись арифметического выражения
Выход: польская запись того же арифметического выражения

Построение

польской записи
Слайд 122

Сумма без скобок скобочная = 1 + 2 – x +

Сумма без скобок

скобочная = 1 + 2 – x + y

– z – 5
оператор = None, польская = «»
пока скобочная != «»
х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
если х – это число или переменная, то
польская += х
если х – это + или –, то
если оператор != None, то польская += оператор
оператор = х
польская += оператор
Слайд 123

Сумма произведений без скобок скобочная = 1 * 2 – x

Сумма произведений без скобок

скобочная = 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
Слайд 124

Сумма произведений без скобок скобочная = 1 * 2 – x

Сумма произведений без скобок

скобочная = 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

Сумма произведений без скобок скобочная = 1 * 2 – x

Сумма произведений без скобок

скобочная = 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
Слайд 126

Сумма произведений без скобок со стеком скобочная = 1 * 2

Сумма произведений без скобок со стеком

скобочная = 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(&операторы)
Слайд 127

Сумма произведений без скобок со стеком скобочная = 1 * 2

Сумма произведений без скобок со стеком

скобочная = 1 * 2 –

x / y * z – 5
операторы = CreateStack(), польская = «»
пока скобочная != «»
х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
если х – это число или переменная, то
польская += х
если х – это * или /, то
если ! IsEmpty(операторы), то
если GetTop(операторы) – это * или /, то польская += Pop(&операторы)
если GetTop(операторы) – это + или –, то ничего не делать
если х – это + или –, то
если ! IsEmpty(операторы), то
если GetTop(операторы) – это + или –, то польская += Pop(&операторы)
если GetTop(операторы) – это * или /, то
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
Push(&операторы, х)
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
Слайд 128

Сумма произведений без скобок со стеком скобочная = 1 * 2

Сумма произведений без скобок со стеком

скобочная = 1 * 2 –

x / y * z – 5
операторы = CreateStack(), польская = «»
пока скобочная != «»
х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
если х – это число или переменная, то
польская += х
если х – это * или /, то
если ! IsEmpty(операторы), то
если GetTop(операторы) – это * или /, то польская += Pop(&операторы)
если GetTop(операторы) – это + или –, то ничего не делать
если х – это + или –, то
пока ! IsEmpty(операторы)
польская += Pop(&операторы)
Push(&операторы, х)
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
Слайд 129

Сумма произведений без скобок со стеком скобочная = 1 * 2

Сумма произведений без скобок со стеком

скобочная = 1 * 2 –

x / y * z – 5
операторы = CreateStack(), польская = «»
пока скобочная != «»
х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
если х – это число или переменная, то
польская += х
если х – это * или /, то
пока ! IsEmpty(операторы) и GetTop(операторы) – это * или /
польская += Pop(&операторы)
если х – это + или –, то
пока ! IsEmpty(операторы)
польская += Pop(&операторы)
Push(&операторы, х)
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
Слайд 130

Сумма произведений без скобок со стеком скобочная = 1 * 2

Сумма произведений без скобок со стеком

скобочная = 1 * 2 –

x / y * z – 5
операторы = CreateStack(), польская = «»
пока скобочная != «»
х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
если х – это число или переменная, то
польская += х
иначе
пока ! IsEmpty(операторы) и приоритет(GetTop(операторы)) >= приоритет(x)
польская += Pop(&операторы)
Push(&операторы, х)
польская += Pop(&операторы)
если ! IsEmpty(операторы), то польская += Pop(&операторы)
Слайд 131

Сумма произведений без скобок со стеком скобочная = 1 * 2

Сумма произведений без скобок со стеком

скобочная = 1 * 2 –

x / y * z – 5
операторы = CreateStack(), польская = «»
пока скобочная != «»
х = ПерваяЛексема(скобочная), Удалить(х, скобочная)
если х – это число или переменная, то
польская += х
иначе
пока ! IsEmpty(операторы) и приоритет(GetTop(операторы)) >= приоритет(x)
польская += Pop(&операторы)
Push(&операторы, х)
пока ! IsEmpty(операторы)
польская += Pop(&операторы)
Слайд 132

Построение польской записи операторы = CreateStack(), польская = «» пока скобочная

Построение польской записи

операторы = CreateStack(), польская = «» пока скобочная != «»

повторять
х = первая лексема скобочная, удалить х из скобочная если х – число или переменная, то польская += х иначе если х = (, то Push(&операторы, х) иначе если х = ), то пока GetTop(операторы) != ( повторять польская += Pop(&операторы) Pop(&операторы) // убрать саму ( иначе пока !IsEmpty(операторы) && П(GetTop(операторы)) >= П(х) повторять польская += Pop(&операторы) Push(&операторы, х)
пока !IsEmpty(операторы) повторять польская += Pop(&операторы)
DestroyStack(операторы)
Слайд 133

Построение польской записи операторы = CreateStack(), польская = «» пока скобочная

Построение польской записи

операторы = CreateStack(), польская = «» пока скобочная != «»

повторять
х = первая лексема скобочная, удалить х из скобочная если х – число или переменная, то польская += х иначе если х = (, то Push(&операторы, х) иначе если х = ), то пока GetTop(операторы) != ( повторять польская += Pop(&операторы) Pop(&операторы) // убрать саму ( иначе пока !IsEmpty(операторы) && П(GetTop(операторы)) >= П(х) повторять польская += Pop(&операторы) Push(&операторы, х)
пока !IsEmpty(операторы) повторять польская += Pop(&операторы)
DestroyStack(операторы)

для удобства считаем П(() < приоритет любой операции

Слайд 134

Пример Выходная строка: Стек: a + ( f − b *

Пример

Выходная строка:

Стек:

a

+

(

f


b

*

c

/

(

z


x

)

+

y

)

/

(

a

*

r


k

)

X =

Слайд 135

Вычисление по польской записи операнды = CreateStack() пока польская != «»

Вычисление по польской записи

операнды = CreateStack()
пока польская != «» повторять
х =

первый элемент польская, удалить х из польская если х – число или переменная, то
Push(&операнды, значение(х)) если х – оператор, то
a = Pop(&операнды)
b = Pop(&операнды)
Push(&операнды, a x b)
значениеПольской = Pop(&операнды)
Destroy(операнды)
Слайд 136

5 Пример Входная строка: Стек: = 5 2 3 * 4

5

Пример

Входная строка:

Стек:

=

5

2

3

*

4

2

/

-

4

/

+

1

-

6

2

4

1

6

4

3

2

1

0