Абстрактные типы данных. Списки

27
ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ЛЕКЦИЯ 8 АБСТРАКТНЫЕ ТИПЫ ДАННЫХ НЕКОТОРЫЕ ВИДЫ ПОСЛЕДОВАТЕЛЬНОСТЕЙ СПИСКИ 1 Максименкова О.В., 2015

Upload: olga-maksimenkova

Post on 15-Jan-2017

229 views

Category:

Education


5 download

TRANSCRIPT

Page 1: Абстрактные типы данных. Списки

ВВЕДЕНИЕ ВПРОГРАММИРОВАНИЕ

ЛЕКЦИЯ 8

АБСТРАКТНЫЕ ТИПЫ ДАННЫХ

НЕКОТОРЫЕ ВИДЫ ПОСЛЕДОВАТЕЛЬНОСТЕЙ

СПИСКИ

1Максименкова О.В., 2015

Page 2: Абстрактные типы данных. Списки

НЕМНОГО ОБ АБСТРАКТНЫХТИПАХ ДАННЫХ

ДЕК, СТЕК, ОЧЕРЕДЬ

Максименкова О.В., 2015 2

Page 3: Абстрактные типы данных. Списки

АБСТРАКТНЫЕ ТИПЫ ДАННЫХ

Максименкова О.В., 2015 3

• АБСТРАКТНЫЙ ТИП ДАННЫХ (АТД) [ABSTRACT LOGIC DESIGN] –

ФУНКЦИОНАЛЬНОЕ ОПИСАНИЕ НЕКОТОРОГО КЛАССА СУЩНОСТЕЙ В

ТЕРМИНАХ ОПЕРАЦИЙ, КОТОРЫЕ МОГУТ ВЫПОЛНЯТЬСЯ НАД НИМИ.

• ИНТЕРФЕЙС АТД – ФОРМАЛЬНОЕ И ОДНОЗНАЧНОЕ ОПИСАНИЕ

СИНТАКСИСА И СЕМАНТИКИ ОПЕРАЦИЙ, КОТОРЫЕ МОГУТ ВЫПОЛНЯТЬСЯ

НАД ЭКЗЕМПЛЯРАМИ АТД.

ТАК ЖЕ, КАК ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ

НЕ ОПРЕДЕЛЯЕТ ОСОБЕННОСТИ ЕГО РЕАЛИЗАЦИИ, ТАК

И ИНТЕРФЕЙС АТД НЕ ОПРЕДЕЛЯЕТ РЕАЛИЗАЦИЮ АТД.

Page 4: Абстрактные типы данных. Списки

КОНТЕЙНЕР

Максименкова О.В., 2015 4

• КОНТЕЙНЕР [CONTAINER] – АБСТРАКТНЫЙ ТИП ДАННЫХ,

ПРЕДСТАВЛЯЮЩИЙ СОБОЙ СТРУКТУРИРОВАННУЮ КОЛЛЕКЦИЮ

ИНФОРМАЦИОННЫХ ЭЛЕМЕНТОВ, ДОСТУП К КОТОРЫМ ОПРЕДЕЛЯЕТСЯ

СТРУКТУРОЙ КОНТЕЙНЕРА.

• ДОБАВЛЕНИЕ И УДАЛЕНИЕ ЭЛЕМЕНТОВ КОНТЕЙНЕРА НАЗОВЁМ ЕГО

ТРАНСФОРМАЦИЕЙ.

• ДОСТУП К ЭЛЕМЕНТУ КОНТЕЙНЕРА – ОПЕРАЦИЯ ПОЛУЧЕНИЯ ИЛИ

ИЗМЕНЕНИЯ ЗНАЧЕНИЯ ЭТОГО ЭЛЕМЕНТА.

• ПОСЛЕДОВАТЕЛЬНОСТЬ [SEQUENCE] – КОНТЕЙНЕР, В КОТОРОМ

ЭЛЕМЕНТЫ УПОРЯДОЧЕНЫ ПО ИНДЕКСАМ (ПРОНУМЕРОВАНЫ).

Page 5: Абстрактные типы данных. Списки

НЕКОТОРЫЕ ВИДЫПОСЛЕДОВАТЕЛЬНОСТЕЙ

• ВЕКТОР [VECTOR]

• ПОСЛЕДОВАТЕЛЬНОСТЬ, В КОТОРОЙ ВОЗМОЖЕН ДОСТУП К

ЛЮБОМУ ЭЛЕМЕНТУ ПО ИНДЕКСУ ЭЛЕМЕНТА

• ДЕК

• СТЕК

• ОЧЕРЕДЬ

Максименкова О.В., 2015 5

ДАЛЕЕ ПОДРОБНЕЕ….

Page 6: Абстрактные типы данных. Списки

ДЕК

Максименкова О.В., 2015 6

ДЕК [DEQUE, DOUBLE ENDED QUEUE] – ПОСЛЕДОВАТЕЛЬНОСТЬ, В

КОТОРОЙ ВОЗМОЖНЫ ТОЛЬКО:

1. ДОСТУП: К КОНЦЕВЫМ ЭЛЕМЕНТАМ;

2. ДОБАВЛЕНИЕ: ДО НАЧАЛЬНОГО И ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;

3. УДАЛЕНИЕ: КОНЦЕВЫХ ЭЛЕМЕНТОВ.

Рисунок взят из статьи о Деке с сайта Kvodo [http://kvodo.ru/deque.html]

Page 7: Абстрактные типы данных. Списки

СТЕК

Максименкова О.В., 2015 7

СТЕК [STACK] – ДЕК, В КОТОРОМ ВОЗМОЖНЫ ТОЛЬКО:

1. ДОСТУП: К КОНЕЧНОМУ ЭЛЕМЕНТУ;

2. ДОБАВЛЕНИЕ: ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;

3. УДАЛЕНИЕ: КОНЕЧНОГО ЭЛЕМЕНТА.

КОНЕЧНЫЙ ЭЛЕМЕНТ СТЕКА НАЗЫВАЮТ ВЕРШИНОЙ СТЕКА.

удалениеpopдобавление

push

Page 8: Абстрактные типы данных. Списки

ОЧЕРЕДЬ

Максименкова О.В., 2015 8

ОЧЕРЕДЬ [QUEUE] – ДЕК, В КОТОРОМ ВОЗМОЖНЫ ТОЛЬКО:

1. ДОСТУП: К НАЧАЛЬНОМУ ЭЛЕМЕНТУ;

2. ДОБАВЛЕНИЕ: ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;

3. УДАЛЕНИЕ: НАЧАЛЬНОГО ЭЛЕМЕНТА.

КОНЕЧНЫЙ ЭЛЕМЕНТ ОЧЕРЕДИ ЧАСТО НАЗЫВАЮТ ХВОСТОМ ОЧЕРЕДИ,

А НАЧАЛЬНЫЙ – ГОЛОВОЙ ОЧЕРЕДИ. удалениеpop

добавлениеpush

Page 9: Абстрактные типы данных. Списки

ТРАНСФОРМАЦИИ СТЕКА И ОЧЕРЕДИ

Максименкова О.В., 2015 9

ТИПЫ ТРАНСФОРМАЦИЙ СТЕКА И ОЧЕРЕДИ ЧАСТО ОБОЗНАЧАЮТ

АББРЕВИАТУРАМИ:

• LIFO (LAST IN – FIRST OUT, ПОСЛЕДНИМ ПРИШЁЛ – ПЕРВЫМ ВЫШЕЛ)

• FIFO (FIRST IN – FIRST OUT, ПЕРВЫМ ПРИШЁЛ – ПЕРВЫМ ВЫШЕЛ).

http://neerc.ifmo.ru/wiki/index.php?title=Очередь

Page 10: Абстрактные типы данных. Списки

ПРИМЕР РЕАЛИЗАЦИИ СТЕКА

Максименкова О.В., 2015 10

class Stack {// вершина стека - последний элемент массиваint[] stack; // массив для элементовpublic void Push(int x) {

if (stack == null) {stack = new int[] { x };return;

}Array.Resize(ref stack, stack.Length + 1);stack[stack.Length - 1] = x;

}public void Pop () {

if (stack == null) return;if (stack.Length == 1) { stack = null; return; }Array.Resize(ref stack, stack.Length - 1);

}}

Page 11: Абстрактные типы данных. Списки

КОНСТРУКТОР И ВСПОМОГАТЕЛЬНЫЙМЕТОД

Максименкова О.В., 2015 11

public Stack() { stack = null; }public string ToString() {

if (stack == null) return "Стек пуст";// выводить будем в привычном порядке слева на правоstring tmp = "Stack: ";for (int i = stack.Length - 1; i > 0; i--)

tmp += (stack[i]+" -> ");tmp += stack[0];return tmp;

}

Пример реализации стека в рамках структурного подхода [http://neerc.ifmo.ru/wiki/index.php?title=Стек]

Page 12: Абстрактные типы данных. Списки

КОД ДЛЯ ОТЛАДКИ ОБЪЕКТА КЛАССАSTACK

Максименкова О.В., 2015 12

Stack example = new Stack();Console.WriteLine(example.ToString());example.Push(13);Console.WriteLine(example.ToString());example.Pop(); Console.WriteLine(example.ToString());example.Push(1);example.Push(2);example.Push(3);Console.WriteLine(example.ToString());

Стек пустStack: 13Стек пустStack: 3 -> 2 -> 1

Page 13: Абстрактные типы данных. Списки

СПИСКИОДНОСВЯЗНЫЙ И ДВУСВЯЗНЫЙ СПИСОК

Максименкова О.В., 2015 13

Page 14: Абстрактные типы данных. Списки

СПИСОК

• СПИСОК ПРЕДСТАВЛЯЕТ СОБОЙ ТАКУЮ РЕАЛИЗАЦИЮ

ПОСЛЕДОВАТЕЛЬНОСТИ ОДНОТИПНЫХ ЭЛЕМЕНТОВ, КОГДА ЭЛЕМЕНТЫ

СВЯЗАНЫ ДРУГ С ДРУГОМ ПОСРЕДСТВОМ ССЫЛОК.

• КАЖДЫЙ ЭЛЕМЕНТ СПИСКА СОДЕРЖИТ НЕ ТОЛЬКО ИНФОРМАЦИОННОЕ

ПОЛЕ, НО ОДНО ИЛИ БОЛЕЕ ПОЛЕЙ СО ССЫЛКАМИ НА ДРУГИЕ

ЭЛЕМЕНТЫ.

Максименкова О.В., 2015 14

Page 15: Абстрактные типы данных. Списки

НАИБОЛЕЕ РАСПРОСТРАНЁННЫЕ СПИСКИ

• ОДНОСВЯЗНЫЕ СПИСКИ: КАЖДЫЙ ЭЛЕМЕНТ, КРОМЕ ПОСЛЕДНЕГО,

СОДЕРЖИТ ССЫЛКУ НА СЛЕДУЮЩИЙ, ПОСЛЕДНИЙ ЭЛЕМЕНТ

ССЫЛАЕТСЯ НА NULL

• ДВУХСВЯЗНЫЕ СПИСКИ: КАЖДЫЙ ЭЛЕМЕНТ, КРОМЕ ПЕРВОГО И

ПОСЛЕДНЕГО, СОДЕРЖИТ ССЫЛКИ НА ПРЕДЫДУЩИЙ И СЛЕДУЮЩИЙ

Максименкова О.В., 2015 15

Page 16: Абстрактные типы данных. Списки

ОДНОСВЯЗНЫЙ СПИСОК

Максименкова О.В., 2015 16

Value Value Value null ...

Начало списка [Top]

5 7 10 null ...

foo bar baz null ...

Примеры

Page 17: Абстрактные типы данных. Списки

Максименкова О.В., 2015 17

Value Value Value null ...

Начало списка [Top]

public class MyListItem {// значение элементаpublic int Value { get; set; }//ссылка на следующий элемент спискаpublic MyListItem Next { get; set; }public MyList() { }public MyList(int val) {

Value = val;Next = null;

}}

Промоделируем элемент односвязного списка

Page 18: Абстрактные типы данных. Списки

Максименкова О.В., 2015 18

MyListItem head = new MyListItem(1);head.Next = new MyListItem(2);head.Next.Next = new MyListItem(3);head.Next.Next.Next = new MyListItem(4);

MyListItem tmp = head;while(tmp != null) {

Console.WriteLine(tmp.Value);tmp = tmp.Next;

}

Page 19: Абстрактные типы данных. Списки

ВСТАВКА ЭЛЕМЕНТА В ОДНОСВЯЗНЫЙСПИСОК

Максименкова О.В., 2015 19

ПУСТЬ ИМЕЕТСЯ НЕКОТОРЫЙ ОДНОСВЯЗНЫЙ СПИСОК И ССЫЛКА Р НАЭЛЕМЕНТ, ПОСЛЕ КОТОРОГО МЫ ХОТИМ ВСТАВИТЬ НОВЫЙ ЭЛЕМЕНТ.

Value Value ...

n n+1

...

Предшествующий

элемент

Состояние списка перед добавление элемента

1. создание нового элемента2. присвоение значений его полям3. добавление связи с элементом, следующим за P4. добавление связи с элементом P

Алгоритм добавления элемента

Page 20: Абстрактные типы данных. Списки

СОЗДАНИЕ ЭЛЕМЕНТА

Максименкова О.В., 2015 20

?

Новый элемент [Tmp]

?

New

Новый элемент [Tmp]

?

1. Создание нового элемента

2. Присвоение значений его полям

MyListItem Tmp = new MyListItem();

Tmp.Value = 2;

Page 21: Абстрактные типы данных. Списки

ДОБАВЛЕНИЕ СВЯЗЕЙ

Максименкова О.В., 2015 21

Value Value ...

n n+1

...

New

Новый элемент [Tmp]

Предшествующий

элемент [P]

Value Value ...

n n+1

...

New

Новый элемент [Tmp]

Предшествующий

элемент [P]

3. добавление связи с элементом, следующим за P

4. добавление связи с элементом P

Tmp.Next = p.Next;

p.Next = Tmp;

Page 22: Абстрактные типы данных. Списки

УДАЛЕНИЕ ЭЛЕМЕНТА ИЗ ОДНОСВЯЗНОГОСПИСКА

Максименкова О.В., 2015 22

ПУСТЬ ИМЕЕТСЯ НЕКОТОРЫЙ ОДНОСВЯЗНЫЙ СПИСОК И ССЫЛКА Р НАЭЛЕМЕНТ, ПРЕДШЕСТВУЮЩИЙ ТОМУ, КОТОРЫЙ МЫ ХОТИМ УДАЛИТЬ.

Состояние списка перед удалением элемента

1. добавление связи между P и следующим за удаляемым элементом

Алгоритм удаления элемента

Value Value

n n+1

...

Предшествующий

элемент [P]

Value ...

n+2

Page 23: Абстрактные типы данных. Списки

ИЗМЕНЕНИЕ ССЫЛОК

Максименкова О.В., 2015 23

Value

Value

nn+1

...

Предшествующий

элемент [P]

Value ...

n+2

Удаляется сборщиком

мусора

Page 24: Абстрактные типы данных. Списки

Максименкова О.В., 2015 24

public void AddNext(MyListItem newItem) {// нужно заменить ссылкиnewItem.Next = this.Next;this.Next = newItem;

}

Немного упростим добавление элемента, добавим экземплярныйметод в класс

Page 25: Абстрактные типы данных. Списки

ДВУСВЯЗНЫЙ СПИСОК

Максименкова О.В., 2015 25

Value Valuenull Value ... null

Начало списка [Head] Конец списка [Tail]

5 7null 9 ... null

Page 26: Абстрактные типы данных. Списки

Максименкова О.В., 2015 26

Value Valuenull Value ... null

Начало списка [Head] Конец списка [Tail]

public class DoulbleLinkyItem {public int Value { get; set; }public DoulbleLinkyItem Next { get; set; }public DoulbleLinkyItem Prev { get; set; }

}

Промоделируем элемент односвязного списка

Page 27: Абстрактные типы данных. Списки

ЗАКОЛЬЦОВАННЫЕ СПИСКИ

Максименкова О.В., 2015 27

ЗАКОЛЬЦЕВАТЬ СПИСОК МОЖНО ПУТЁМ ИЗМЕНЕНИЯ ССЫЛКИПОСЛЕДНЕГО ЭЛЕМЕНТА ТАКИМ ОБРАЗОМ, ЧТОБЫ ОНА УКАЗЫВАЛА НАПЕРВЫЙ ЭЛЕМЕНТ И НАОБОРОТ.