Абстрактные типы данных. Списки
Post on 15-Jan-2017
230 Views
Preview:
TRANSCRIPT
ВВЕДЕНИЕ ВПРОГРАММИРОВАНИЕ
ЛЕКЦИЯ 8
АБСТРАКТНЫЕ ТИПЫ ДАННЫХ
НЕКОТОРЫЕ ВИДЫ ПОСЛЕДОВАТЕЛЬНОСТЕЙ
СПИСКИ
1Максименкова О.В., 2015
НЕМНОГО ОБ АБСТРАКТНЫХТИПАХ ДАННЫХ
ДЕК, СТЕК, ОЧЕРЕДЬ
Максименкова О.В., 2015 2
АБСТРАКТНЫЕ ТИПЫ ДАННЫХ
Максименкова О.В., 2015 3
• АБСТРАКТНЫЙ ТИП ДАННЫХ (АТД) [ABSTRACT LOGIC DESIGN] –
ФУНКЦИОНАЛЬНОЕ ОПИСАНИЕ НЕКОТОРОГО КЛАССА СУЩНОСТЕЙ В
ТЕРМИНАХ ОПЕРАЦИЙ, КОТОРЫЕ МОГУТ ВЫПОЛНЯТЬСЯ НАД НИМИ.
• ИНТЕРФЕЙС АТД – ФОРМАЛЬНОЕ И ОДНОЗНАЧНОЕ ОПИСАНИЕ
СИНТАКСИСА И СЕМАНТИКИ ОПЕРАЦИЙ, КОТОРЫЕ МОГУТ ВЫПОЛНЯТЬСЯ
НАД ЭКЗЕМПЛЯРАМИ АТД.
ТАК ЖЕ, КАК ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ
НЕ ОПРЕДЕЛЯЕТ ОСОБЕННОСТИ ЕГО РЕАЛИЗАЦИИ, ТАК
И ИНТЕРФЕЙС АТД НЕ ОПРЕДЕЛЯЕТ РЕАЛИЗАЦИЮ АТД.
КОНТЕЙНЕР
Максименкова О.В., 2015 4
• КОНТЕЙНЕР [CONTAINER] – АБСТРАКТНЫЙ ТИП ДАННЫХ,
ПРЕДСТАВЛЯЮЩИЙ СОБОЙ СТРУКТУРИРОВАННУЮ КОЛЛЕКЦИЮ
ИНФОРМАЦИОННЫХ ЭЛЕМЕНТОВ, ДОСТУП К КОТОРЫМ ОПРЕДЕЛЯЕТСЯ
СТРУКТУРОЙ КОНТЕЙНЕРА.
• ДОБАВЛЕНИЕ И УДАЛЕНИЕ ЭЛЕМЕНТОВ КОНТЕЙНЕРА НАЗОВЁМ ЕГО
ТРАНСФОРМАЦИЕЙ.
• ДОСТУП К ЭЛЕМЕНТУ КОНТЕЙНЕРА – ОПЕРАЦИЯ ПОЛУЧЕНИЯ ИЛИ
ИЗМЕНЕНИЯ ЗНАЧЕНИЯ ЭТОГО ЭЛЕМЕНТА.
• ПОСЛЕДОВАТЕЛЬНОСТЬ [SEQUENCE] – КОНТЕЙНЕР, В КОТОРОМ
ЭЛЕМЕНТЫ УПОРЯДОЧЕНЫ ПО ИНДЕКСАМ (ПРОНУМЕРОВАНЫ).
НЕКОТОРЫЕ ВИДЫПОСЛЕДОВАТЕЛЬНОСТЕЙ
• ВЕКТОР [VECTOR]
• ПОСЛЕДОВАТЕЛЬНОСТЬ, В КОТОРОЙ ВОЗМОЖЕН ДОСТУП К
ЛЮБОМУ ЭЛЕМЕНТУ ПО ИНДЕКСУ ЭЛЕМЕНТА
• ДЕК
• СТЕК
• ОЧЕРЕДЬ
Максименкова О.В., 2015 5
ДАЛЕЕ ПОДРОБНЕЕ….
ДЕК
Максименкова О.В., 2015 6
ДЕК [DEQUE, DOUBLE ENDED QUEUE] – ПОСЛЕДОВАТЕЛЬНОСТЬ, В
КОТОРОЙ ВОЗМОЖНЫ ТОЛЬКО:
1. ДОСТУП: К КОНЦЕВЫМ ЭЛЕМЕНТАМ;
2. ДОБАВЛЕНИЕ: ДО НАЧАЛЬНОГО И ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;
3. УДАЛЕНИЕ: КОНЦЕВЫХ ЭЛЕМЕНТОВ.
Рисунок взят из статьи о Деке с сайта Kvodo [http://kvodo.ru/deque.html]
СТЕК
Максименкова О.В., 2015 7
СТЕК [STACK] – ДЕК, В КОТОРОМ ВОЗМОЖНЫ ТОЛЬКО:
1. ДОСТУП: К КОНЕЧНОМУ ЭЛЕМЕНТУ;
2. ДОБАВЛЕНИЕ: ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;
3. УДАЛЕНИЕ: КОНЕЧНОГО ЭЛЕМЕНТА.
КОНЕЧНЫЙ ЭЛЕМЕНТ СТЕКА НАЗЫВАЮТ ВЕРШИНОЙ СТЕКА.
удалениеpopдобавление
push
ОЧЕРЕДЬ
Максименкова О.В., 2015 8
ОЧЕРЕДЬ [QUEUE] – ДЕК, В КОТОРОМ ВОЗМОЖНЫ ТОЛЬКО:
1. ДОСТУП: К НАЧАЛЬНОМУ ЭЛЕМЕНТУ;
2. ДОБАВЛЕНИЕ: ПОСЛЕ КОНЕЧНОГО ЭЛЕМЕНТА;
3. УДАЛЕНИЕ: НАЧАЛЬНОГО ЭЛЕМЕНТА.
КОНЕЧНЫЙ ЭЛЕМЕНТ ОЧЕРЕДИ ЧАСТО НАЗЫВАЮТ ХВОСТОМ ОЧЕРЕДИ,
А НАЧАЛЬНЫЙ – ГОЛОВОЙ ОЧЕРЕДИ. удалениеpop
добавлениеpush
ТРАНСФОРМАЦИИ СТЕКА И ОЧЕРЕДИ
Максименкова О.В., 2015 9
ТИПЫ ТРАНСФОРМАЦИЙ СТЕКА И ОЧЕРЕДИ ЧАСТО ОБОЗНАЧАЮТ
АББРЕВИАТУРАМИ:
• LIFO (LAST IN – FIRST OUT, ПОСЛЕДНИМ ПРИШЁЛ – ПЕРВЫМ ВЫШЕЛ)
• FIFO (FIRST IN – FIRST OUT, ПЕРВЫМ ПРИШЁЛ – ПЕРВЫМ ВЫШЕЛ).
http://neerc.ifmo.ru/wiki/index.php?title=Очередь
ПРИМЕР РЕАЛИЗАЦИИ СТЕКА
Максименкова О.В., 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);
}}
КОНСТРУКТОР И ВСПОМОГАТЕЛЬНЫЙМЕТОД
Максименкова О.В., 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=Стек]
КОД ДЛЯ ОТЛАДКИ ОБЪЕКТА КЛАССА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
СПИСКИОДНОСВЯЗНЫЙ И ДВУСВЯЗНЫЙ СПИСОК
Максименкова О.В., 2015 13
СПИСОК
• СПИСОК ПРЕДСТАВЛЯЕТ СОБОЙ ТАКУЮ РЕАЛИЗАЦИЮ
ПОСЛЕДОВАТЕЛЬНОСТИ ОДНОТИПНЫХ ЭЛЕМЕНТОВ, КОГДА ЭЛЕМЕНТЫ
СВЯЗАНЫ ДРУГ С ДРУГОМ ПОСРЕДСТВОМ ССЫЛОК.
• КАЖДЫЙ ЭЛЕМЕНТ СПИСКА СОДЕРЖИТ НЕ ТОЛЬКО ИНФОРМАЦИОННОЕ
ПОЛЕ, НО ОДНО ИЛИ БОЛЕЕ ПОЛЕЙ СО ССЫЛКАМИ НА ДРУГИЕ
ЭЛЕМЕНТЫ.
Максименкова О.В., 2015 14
НАИБОЛЕЕ РАСПРОСТРАНЁННЫЕ СПИСКИ
• ОДНОСВЯЗНЫЕ СПИСКИ: КАЖДЫЙ ЭЛЕМЕНТ, КРОМЕ ПОСЛЕДНЕГО,
СОДЕРЖИТ ССЫЛКУ НА СЛЕДУЮЩИЙ, ПОСЛЕДНИЙ ЭЛЕМЕНТ
ССЫЛАЕТСЯ НА NULL
• ДВУХСВЯЗНЫЕ СПИСКИ: КАЖДЫЙ ЭЛЕМЕНТ, КРОМЕ ПЕРВОГО И
ПОСЛЕДНЕГО, СОДЕРЖИТ ССЫЛКИ НА ПРЕДЫДУЩИЙ И СЛЕДУЮЩИЙ
Максименкова О.В., 2015 15
ОДНОСВЯЗНЫЙ СПИСОК
Максименкова О.В., 2015 16
Value Value Value null ...
Начало списка [Top]
5 7 10 null ...
foo bar baz null ...
Примеры
Максименкова О.В., 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;
}}
Промоделируем элемент односвязного списка
Максименкова О.В., 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;
}
ВСТАВКА ЭЛЕМЕНТА В ОДНОСВЯЗНЫЙСПИСОК
Максименкова О.В., 2015 19
ПУСТЬ ИМЕЕТСЯ НЕКОТОРЫЙ ОДНОСВЯЗНЫЙ СПИСОК И ССЫЛКА Р НАЭЛЕМЕНТ, ПОСЛЕ КОТОРОГО МЫ ХОТИМ ВСТАВИТЬ НОВЫЙ ЭЛЕМЕНТ.
Value Value ...
n n+1
...
Предшествующий
элемент
Состояние списка перед добавление элемента
1. создание нового элемента2. присвоение значений его полям3. добавление связи с элементом, следующим за P4. добавление связи с элементом P
Алгоритм добавления элемента
СОЗДАНИЕ ЭЛЕМЕНТА
Максименкова О.В., 2015 20
?
Новый элемент [Tmp]
?
New
Новый элемент [Tmp]
?
1. Создание нового элемента
2. Присвоение значений его полям
MyListItem Tmp = new MyListItem();
Tmp.Value = 2;
ДОБАВЛЕНИЕ СВЯЗЕЙ
Максименкова О.В., 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;
УДАЛЕНИЕ ЭЛЕМЕНТА ИЗ ОДНОСВЯЗНОГОСПИСКА
Максименкова О.В., 2015 22
ПУСТЬ ИМЕЕТСЯ НЕКОТОРЫЙ ОДНОСВЯЗНЫЙ СПИСОК И ССЫЛКА Р НАЭЛЕМЕНТ, ПРЕДШЕСТВУЮЩИЙ ТОМУ, КОТОРЫЙ МЫ ХОТИМ УДАЛИТЬ.
Состояние списка перед удалением элемента
1. добавление связи между P и следующим за удаляемым элементом
Алгоритм удаления элемента
Value Value
n n+1
...
Предшествующий
элемент [P]
Value ...
n+2
ИЗМЕНЕНИЕ ССЫЛОК
Максименкова О.В., 2015 23
Value
Value
nn+1
...
Предшествующий
элемент [P]
Value ...
n+2
Удаляется сборщиком
мусора
Максименкова О.В., 2015 24
public void AddNext(MyListItem newItem) {// нужно заменить ссылкиnewItem.Next = this.Next;this.Next = newItem;
}
Немного упростим добавление элемента, добавим экземплярныйметод в класс
ДВУСВЯЗНЫЙ СПИСОК
Максименкова О.В., 2015 25
Value Valuenull Value ... null
Начало списка [Head] Конец списка [Tail]
5 7null 9 ... null
Максименкова О.В., 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; }
}
Промоделируем элемент односвязного списка
ЗАКОЛЬЦОВАННЫЕ СПИСКИ
Максименкова О.В., 2015 27
ЗАКОЛЬЦЕВАТЬ СПИСОК МОЖНО ПУТЁМ ИЗМЕНЕНИЯ ССЫЛКИПОСЛЕДНЕГО ЭЛЕМЕНТА ТАКИМ ОБРАЗОМ, ЧТОБЫ ОНА УКАЗЫВАЛА НАПЕРВЫЙ ЭЛЕМЕНТ И НАОБОРОТ.
top related