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