SlideShare a Scribd company logo
1 of 45
Download to read offline
Лекция 4:
Стек. Очередь.
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Контроль
2
1. Что такое вычислительная сложность алгоритма?
2. Что такое Θ, , O?
3. Основные свойства алгоритма поразрядной сортировки
(Radix Sort).
4. Какова трудоемкость вставки элемента в начало
односвязного списка?
5. Какова трудоемкость вставки элемента в конец
односвязного списка?
6. Какова трудоемкость поиска элемента в односвязном
списке?
7. Какова трудоемкость удаления элемента из односвязного
списка?
Стек (Stack)
3
Стек (Stack) – структура данных с дисциплиной
доступа к элементам “последним пришел – первым вышел”
(Last In – First Out, LIFO)
Top
PopPush
D
C
B
A
АТД “Стек” (Stack)
4
Операция Описание
Push(s, x) Помещает элемент x в стек s
Pop(s) Извлекает элемент из стека s
Size(s)
Возвращает количество элементов
в стеке s
Реализация АТД “Стек”
5
Подходы к реализации стека:
1. На основе связных списков (linked lists)
Длина стека ограничена объемом доступной памяти
2. На основе статических массивов
Длина стека фиксирована (задана его максимальная длина
– количество элементов в массиве)
Реализация стека на основе связных списков
6
Элементы стека хранятся в односвязном списке
(singly linked list)
Добавление элемент и удаление выполняется за время O(1)
TopSize
Данные Next Данные Next Данные Next NULL
Stack:
Реализация стека на основе связных списков
7
#include <stdio.h>
#include <stdlib.h>
#include "llist.h" /* см. лек. 3 */
struct stack {
struct listnode *top;
int size;
};
Реализация стека на основе связных списков
8
/*
* Фрагмент файла llist.c
*/
struct listnode {
int value;
struct listnode *next;
};
Реализация стека на основе связных списков
/* stack_create: Creates an empty stack. */
struct stack *stack_create()
{
struct stack *s = malloc(sizeof(*s));
if (s != NULL) {
s->size = 0;
s->top = NULL;
}
return s;
}
9
TCreate = O(1)
Реализация стека на основе связных списков
/* stack_free: Removes stack. */
void stack_free(struct stack *s)
{
while (s->size > 0)
stack_pop(s);
free(s);
}
10
TopSize
Данные Next Данные Next Данные Next NULL
Stack:
TFree = O(n)
Реализация стека на основе связных списков
/* stack_size: Returns size of a stack. */
int stack_size(struct stack *s)
{
return s->size;
}
11
TSize = O(1)
Реализация стека на основе связных списков
12
int main()
{
struct stack *s;
s = stack_create();
printf("Stack size: %dn", stack_size(s));
stack_free(s);
return 0;
}
Реализация стека на основе связных списков
/* stack_push: Pushes item to the stack. */
int stack_push(struct stack *s, int value)
{
s->top = list_addfront(s->top, value);
if (s->top == NULL) {
fprintf(stderr,
"stack: Stack overflown");
return -1;
}
s->size++;
return 0;
}
13
TPush = O(1)
Реализация стека на основе связных списков
/* stack_pop: Pops item from the stack. */
int stack_pop(struct stack *s)
{
struct listnode *next;
int value;
if (s->top == NULL) {
fprintf(stderr, "stack: Stack underflown");
return -1;
}
next = s->top->next;
value = s->top->value;
free(s->top);
s->top = next;
s->size--;
return value;
} 14TPop = O(1)
Реализация стека на основе связных списков
int main()
{
struct stack *s;
int i, val;
s = stack_create();
for (i = 1; i <= 10; i++) {
stack_push(s, i);
}
for (i = 1; i <= 11; i++) {
val = stack_pop(s);
printf("pop: %dn", val);
}
stack_free(s);
return 0;
} 15
pop: 10
pop: 9
pop: 8
pop: 7
pop: 6
pop: 5
pop: 4
pop: 3
pop: 2
pop: 1
pop: -1
Реализация стека на основе массива
16
Элементы стека хранятся в массиве фиксированной
длины L
Добавление элемент и удаление выполняется
за время O(1)
L – 1
…
2 C
1 B
0 A
Top
Реализация стека на основе массива
17
#include <stdio.h>
#include <stdlib.h>
struct stack {
int *v;
int top;
int size;
int maxsize;
};
Реализация стека на основе массива
/* stack_create: Creates an empty stack. */
struct stack *stack_create(int maxsize)
{
struct stack *s = malloc(sizeof(*s));
if (s != NULL) {
s->v = malloc(sizeof(int) * maxsize);
if (s->v == NULL) {
free(s);
return NULL;
}
s->size = 0;
s->top = 0;
s->maxsize = maxsize;
}
return s;
}
18
TCreate = O(1)
Реализация стека на основе массива
19
/* stack_free: Removes stack. */
void stack_free(struct stack *s)
{
free(s->v);
free(s);
}
/* stack_size: Returns size of a stack. */
int stack_size(struct stack *s)
{
return s->size;
}
TFree = O(1)
TSize = O(1)
Реализация стека на основе массива
20
/* stack_push: Pushes item to the stack. */
int stack_push(struct stack *s, int value)
{
if (s->top < s->maxsize) {
s->v[s->top++] = value;
s->size++;
} else {
fprintf(stderr,
"stack: Stack overflown");
return -1;
}
return 0;
} TPush = O(1)
Реализация стека на основе массива
21
/* stack_pop: Pops item from the stack. */
int stack_pop(struct stack *s)
{
if (s->top == 0) {
fprintf(stderr,
"stack: Stack underflown");
return -1;
}
s->size--;
return s->v[--s->top];
} TPop = O(1)
Очередь (Queue)
22
Очередь (Queue) – структура данных с дисциплиной
доступа к элементам “первым пришел – первым вышел”
(First In – First Out, FIFO)
Слон Жираф Волк Заяц
Front
(head)
Кит
Рысь
Back
(tail, rear)
DequeueEnqueue
Очередь (Queue)
23
Очереди широко используется в алгоритмах обработки
данных:
o очереди печати
o буфер ввода с клавиатуры
o алгоритмы работы с графами
АТД “Очередь” (Queue)
24
Операция Описание
Enqueue(q, x) Добавляет элемент x в очередь q
Dequeue(q) Извлекает элемент из очереди q
Size(q)
Возвращает количество элементов в
очереди q
Clear(q) Очищает очередь q
Реализация АТД “Очередь”
25
Подходы к реализации очередей:
1. На основе связных списков
Длина очереди ограничена лишь объемом
доступной памяти
2. На основе статических массивов
Длина очереди фиксирована (задана максимальная длина)
Реализация очереди на основе связных списков
26
Элементы очереди хранятся в односвязном списке
(singly linked list)
Для быстрого (за время O(1)) добавления и извлечения
элементов из списка поддерживается указатель на
последний элемент (tail).
Новые элементы добавляются в конец списка.
Head TailSize
Данные Next Данные Next Данные Next NULL
Queue:
Реализация очереди на основе связных списков
27
Преимущества: длина очереди ограничена лишь объемом
доступной памяти
Недостатки (по сравнению с реализацией на основе
массивов): работа с очередью немного медленнее,
требуется больше памяти для хранения одного элемента.
Head TailSize
Данные Next Данные Next Данные Next NULL
Queue:
Реализация очереди на основе связных списков
28
#include <stdio.h>
#include <stdlib.h>
#include "llist.h"
struct queue {
struct listnode *head;
struct listnode *tail;
int size;
};
Реализация очереди на основе связных списков
29
/* queue_create: Creates an empty queue. */
struct queue *queue_create()
{
struct queue *q = malloc(sizeof(*q));
if (q != NULL) {
q->size = 0;
q->head = NULL;
q->tail = NULL;
}
return q;
} TCreate = O(1)
Реализация очереди на основе связных списков
30
/* queue_free: Removes queue. */
void queue_free(struct queue *q)
{
while (q->size > 0)
queue_dequeue(q);
free(q);
} TFree = O(n)
Реализация очереди на основе связных списков
31
/* queue_size: Returns size of a queue. */
int queue_size(struct queue *q)
{
return q->size;
}
int main()
{
struct queue *q;
q = queue_create();
queue_free(q);
return 0;
}
TSize = O(1)
Реализация очереди на основе связных списков
/* queue_enqueue: Add item to the queue. */
void queue_enqueue(struct queue *q, int value)
{
struct listnode *oldtail = q->tail;
/* Create new node */
q->tail = list_createnode(value);
if (q->head == NULL) {
/* List is empty */
q->head = q->tail;
} else {
/* Add new node to the end of list */
oldtail->next = q->tail;
}
q->size++;
} 32
TEnqueue = O(1)
Реализация очереди на основе связных списков
33
int main()
{
struct queue *q;
int i;
q = queue_create();
for (i = 1; i <= 10; i++) {
queue_enqueue(q, i);
}
printf("Queue size: %dn", queue_size(q));
queue_free(q);
return 0;
}
Реализация очереди на основе связных списков
/* queue_dequeue: Gets item from the queue. */
int queue_dequeue(struct queue *q)
{
int value;
struct listnode *p;
if (q->size == 0)
return -1;
/* Delete first node */
value = q->head->value;
p = q->head->next;
free(q->head);
q->head = p;
q->size--;
return value;
} 34TDequeue = O(1)
Реализация очереди на основе связных списков
int main()
{
struct queue *q;
int i, j;
q = queue_create();
/* ... */
for (i = 1; i <= 11; i++) {
j = queue_dequeue(q);
printf("%d: next element: %dn", i, j);
}
queue_free(q);
return 0;
}
35
Реализация очереди на основе циклических массивов
36
Элементы очереди хранятся в массиве фиксированной
длины [0..L – 1]
Массив логически представляется в виде кольца (circular
buffer)
В пустой очереди Tail = 0, Head = L
X
Tail Head
0 1 2 L – 1 L
Реализация очереди на основе циклических массивов
37
При добавлении элемента в очередь значение Tail
циклически увеличивается на 1 (сдвигается на следующую
свободную позицию)
Если Head = Tail + 1, то очередь переполнена!
1 X
Tail Head
0 1 2 3 L – 1 L
Enqueue(1):
Реализация очереди на основе циклических массивов
38
При удалении возвращается элемент с номером Head % L
Значение Head циклически увеличивается на 1 (указывает
на следующий элемент очереди)
1 X
Tail Head
0 1 2 3 L – 1 L
X
TailHead
0 1 2 3 L – 1 L
Dequeue():
Реализация очереди на основе циклических массивов
39
#include <stdio.h>
#include <stdlib.h>
struct queue {
int *v;
int head;
int tail;
int size;
int maxsize;
};
Реализация очереди на основе циклических массивов
/* queue_create: Creates an empty queue. */
struct queue *queue_create(int maxsize)
{
struct queue *q = malloc(sizeof(*q));
if (q != NULL) {
q->v = malloc(sizeof(int) * (maxsize + 1));
if (q->v == NULL) {
free(q);
return NULL;
}
q->maxsize = maxsize;
q->size = 0;
q->head = maxsize + 1;
q->tail = 0;
}
return q;
} 40
TCreate = O(1)
Реализация очереди на основе циклических массивов
41
/* queue_free: Removes queue. */
void queue_free(struct queue *q)
{
free(q->v);
free(q);
}
/* queue_size: Returns size of a queue. */
int queue_size(struct queue *q)
{
return q->size;
}
Реализация очереди на основе циклических массивов
/* queue_enqueue: Add item to the queue. */
int queue_enqueue(struct queue *q, int value)
{
if (q->head == q->tail + 1) {
fprintf(stderr,
"queue: Queue overflown");
return -1;
}
q->v[q->tail++] = value;
q->tail = q->tail % (q->maxsize + 1);
q->size++;
return 0;
} 42
TEnqueue = O(1)
Реализация очереди на основе циклических массивов
/* queue_dequeue: Gets item from the queue. */
int queue_dequeue(struct queue *q)
{
if (q->head % (q->maxsize + 1) == q->tail)
{
/* Queue is empty */
fprintf(stderr,
"queue: Queue is emptyn");
return -1;
}
q->head = q->head % (q->maxsize + 1);
q->size--;
return q->v[q->head++];
} TDequeue = O(1)
43
Реализация очереди на основе циклических массивов
int main()
{
struct queue *q;
int i, val;
q = queue_create(10);
val = queue_dequeue(q);
for (i = 1; i <= 11; i++) {
queue_enqueue(q, i);
}
for (i = 1; i <= 5; i++) {
val = queue_dequeue(q);
}
queue_free(q);
return 0;
} 44
Задание
45
Найти информацию о двухсторонней очереди
(дек, deque – double ended queue)

More Related Content

What's hot

13. Indexing MTrees - Data Structures using C++ by Varsha Patil
13. Indexing MTrees - Data Structures using C++ by Varsha Patil13. Indexing MTrees - Data Structures using C++ by Varsha Patil
13. Indexing MTrees - Data Structures using C++ by Varsha Patilwidespreadpromotion
 
Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.
Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.
Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.Alex Dainiak
 
Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]Muhammad Hammad Waseem
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesLorenzo Alberton
 
Data Structure and Algorithms Hashing
Data Structure and Algorithms HashingData Structure and Algorithms Hashing
Data Structure and Algorithms HashingManishPrajapati78
 
Java/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBCJava/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBCFAKHRUN NISHA
 
Set data structure
Set data structure Set data structure
Set data structure Tech_MX
 

What's hot (20)

6-Python-Recursion PPT.pptx
6-Python-Recursion PPT.pptx6-Python-Recursion PPT.pptx
6-Python-Recursion PPT.pptx
 
Trees
TreesTrees
Trees
 
08 Hash Tables
08 Hash Tables08 Hash Tables
08 Hash Tables
 
13. Indexing MTrees - Data Structures using C++ by Varsha Patil
13. Indexing MTrees - Data Structures using C++ by Varsha Patil13. Indexing MTrees - Data Structures using C++ by Varsha Patil
13. Indexing MTrees - Data Structures using C++ by Varsha Patil
 
Database connectivity in python
Database connectivity in pythonDatabase connectivity in python
Database connectivity in python
 
Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.
Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.
Коды, исправляющие ошибки. Простейшие границы. Коды Варшамова—Тененгольца.
 
Minimum spanning tree
Minimum spanning treeMinimum spanning tree
Minimum spanning tree
 
Heaps & priority queues
Heaps & priority queuesHeaps & priority queues
Heaps & priority queues
 
Python multithreaded programming
Python   multithreaded programmingPython   multithreaded programming
Python multithreaded programming
 
Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]Data Structures - Lecture 7 [Linked List]
Data Structures - Lecture 7 [Linked List]
 
Divide and Conquer
Divide and ConquerDivide and Conquer
Divide and Conquer
 
Bloom filter
Bloom filterBloom filter
Bloom filter
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
 
Python programming : Abstract classes interfaces
Python programming : Abstract classes interfacesPython programming : Abstract classes interfaces
Python programming : Abstract classes interfaces
 
PHP Basic & Variables
PHP Basic & VariablesPHP Basic & Variables
PHP Basic & Variables
 
Php and MySQL
Php and MySQLPhp and MySQL
Php and MySQL
 
Tree and Binary Search tree
Tree and Binary Search treeTree and Binary Search tree
Tree and Binary Search tree
 
Data Structure and Algorithms Hashing
Data Structure and Algorithms HashingData Structure and Algorithms Hashing
Data Structure and Algorithms Hashing
 
Java/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBCJava/Servlet/JSP/JDBC
Java/Servlet/JSP/JDBC
 
Set data structure
Set data structure Set data structure
Set data structure
 

Viewers also liked

Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...Mikhail Kurnosov
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаMikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 

Viewers also liked (11)

Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
Лекция 1: Архитектурно-ориентированная оптимизация программного обеспечения (...
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поиска
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 

Similar to Лекция 4: Стек. Очередь

Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1simple_people
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Technopark
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Mikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Nikolay Grebenshikov
 
Лекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяЛекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяMikhail Kurnosov
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияAlexey Paznikov
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 

Similar to Лекция 4: Стек. Очередь (20)

Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1Лекция 3 Элементарные структуры данных Часть 1
Лекция 3 Элементарные структуры данных Часть 1
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
 
Лекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяЛекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревья
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 

More from Mikhail Kurnosov

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 

Лекция 4: Стек. Очередь

  • 1. Лекция 4: Стек. Очередь. Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Контроль 2 1. Что такое вычислительная сложность алгоритма? 2. Что такое Θ, , O? 3. Основные свойства алгоритма поразрядной сортировки (Radix Sort). 4. Какова трудоемкость вставки элемента в начало односвязного списка? 5. Какова трудоемкость вставки элемента в конец односвязного списка? 6. Какова трудоемкость поиска элемента в односвязном списке? 7. Какова трудоемкость удаления элемента из односвязного списка?
  • 3. Стек (Stack) 3 Стек (Stack) – структура данных с дисциплиной доступа к элементам “последним пришел – первым вышел” (Last In – First Out, LIFO) Top PopPush D C B A
  • 4. АТД “Стек” (Stack) 4 Операция Описание Push(s, x) Помещает элемент x в стек s Pop(s) Извлекает элемент из стека s Size(s) Возвращает количество элементов в стеке s
  • 5. Реализация АТД “Стек” 5 Подходы к реализации стека: 1. На основе связных списков (linked lists) Длина стека ограничена объемом доступной памяти 2. На основе статических массивов Длина стека фиксирована (задана его максимальная длина – количество элементов в массиве)
  • 6. Реализация стека на основе связных списков 6 Элементы стека хранятся в односвязном списке (singly linked list) Добавление элемент и удаление выполняется за время O(1) TopSize Данные Next Данные Next Данные Next NULL Stack:
  • 7. Реализация стека на основе связных списков 7 #include <stdio.h> #include <stdlib.h> #include "llist.h" /* см. лек. 3 */ struct stack { struct listnode *top; int size; };
  • 8. Реализация стека на основе связных списков 8 /* * Фрагмент файла llist.c */ struct listnode { int value; struct listnode *next; };
  • 9. Реализация стека на основе связных списков /* stack_create: Creates an empty stack. */ struct stack *stack_create() { struct stack *s = malloc(sizeof(*s)); if (s != NULL) { s->size = 0; s->top = NULL; } return s; } 9 TCreate = O(1)
  • 10. Реализация стека на основе связных списков /* stack_free: Removes stack. */ void stack_free(struct stack *s) { while (s->size > 0) stack_pop(s); free(s); } 10 TopSize Данные Next Данные Next Данные Next NULL Stack: TFree = O(n)
  • 11. Реализация стека на основе связных списков /* stack_size: Returns size of a stack. */ int stack_size(struct stack *s) { return s->size; } 11 TSize = O(1)
  • 12. Реализация стека на основе связных списков 12 int main() { struct stack *s; s = stack_create(); printf("Stack size: %dn", stack_size(s)); stack_free(s); return 0; }
  • 13. Реализация стека на основе связных списков /* stack_push: Pushes item to the stack. */ int stack_push(struct stack *s, int value) { s->top = list_addfront(s->top, value); if (s->top == NULL) { fprintf(stderr, "stack: Stack overflown"); return -1; } s->size++; return 0; } 13 TPush = O(1)
  • 14. Реализация стека на основе связных списков /* stack_pop: Pops item from the stack. */ int stack_pop(struct stack *s) { struct listnode *next; int value; if (s->top == NULL) { fprintf(stderr, "stack: Stack underflown"); return -1; } next = s->top->next; value = s->top->value; free(s->top); s->top = next; s->size--; return value; } 14TPop = O(1)
  • 15. Реализация стека на основе связных списков int main() { struct stack *s; int i, val; s = stack_create(); for (i = 1; i <= 10; i++) { stack_push(s, i); } for (i = 1; i <= 11; i++) { val = stack_pop(s); printf("pop: %dn", val); } stack_free(s); return 0; } 15 pop: 10 pop: 9 pop: 8 pop: 7 pop: 6 pop: 5 pop: 4 pop: 3 pop: 2 pop: 1 pop: -1
  • 16. Реализация стека на основе массива 16 Элементы стека хранятся в массиве фиксированной длины L Добавление элемент и удаление выполняется за время O(1) L – 1 … 2 C 1 B 0 A Top
  • 17. Реализация стека на основе массива 17 #include <stdio.h> #include <stdlib.h> struct stack { int *v; int top; int size; int maxsize; };
  • 18. Реализация стека на основе массива /* stack_create: Creates an empty stack. */ struct stack *stack_create(int maxsize) { struct stack *s = malloc(sizeof(*s)); if (s != NULL) { s->v = malloc(sizeof(int) * maxsize); if (s->v == NULL) { free(s); return NULL; } s->size = 0; s->top = 0; s->maxsize = maxsize; } return s; } 18 TCreate = O(1)
  • 19. Реализация стека на основе массива 19 /* stack_free: Removes stack. */ void stack_free(struct stack *s) { free(s->v); free(s); } /* stack_size: Returns size of a stack. */ int stack_size(struct stack *s) { return s->size; } TFree = O(1) TSize = O(1)
  • 20. Реализация стека на основе массива 20 /* stack_push: Pushes item to the stack. */ int stack_push(struct stack *s, int value) { if (s->top < s->maxsize) { s->v[s->top++] = value; s->size++; } else { fprintf(stderr, "stack: Stack overflown"); return -1; } return 0; } TPush = O(1)
  • 21. Реализация стека на основе массива 21 /* stack_pop: Pops item from the stack. */ int stack_pop(struct stack *s) { if (s->top == 0) { fprintf(stderr, "stack: Stack underflown"); return -1; } s->size--; return s->v[--s->top]; } TPop = O(1)
  • 22. Очередь (Queue) 22 Очередь (Queue) – структура данных с дисциплиной доступа к элементам “первым пришел – первым вышел” (First In – First Out, FIFO) Слон Жираф Волк Заяц Front (head) Кит Рысь Back (tail, rear) DequeueEnqueue
  • 23. Очередь (Queue) 23 Очереди широко используется в алгоритмах обработки данных: o очереди печати o буфер ввода с клавиатуры o алгоритмы работы с графами
  • 24. АТД “Очередь” (Queue) 24 Операция Описание Enqueue(q, x) Добавляет элемент x в очередь q Dequeue(q) Извлекает элемент из очереди q Size(q) Возвращает количество элементов в очереди q Clear(q) Очищает очередь q
  • 25. Реализация АТД “Очередь” 25 Подходы к реализации очередей: 1. На основе связных списков Длина очереди ограничена лишь объемом доступной памяти 2. На основе статических массивов Длина очереди фиксирована (задана максимальная длина)
  • 26. Реализация очереди на основе связных списков 26 Элементы очереди хранятся в односвязном списке (singly linked list) Для быстрого (за время O(1)) добавления и извлечения элементов из списка поддерживается указатель на последний элемент (tail). Новые элементы добавляются в конец списка. Head TailSize Данные Next Данные Next Данные Next NULL Queue:
  • 27. Реализация очереди на основе связных списков 27 Преимущества: длина очереди ограничена лишь объемом доступной памяти Недостатки (по сравнению с реализацией на основе массивов): работа с очередью немного медленнее, требуется больше памяти для хранения одного элемента. Head TailSize Данные Next Данные Next Данные Next NULL Queue:
  • 28. Реализация очереди на основе связных списков 28 #include <stdio.h> #include <stdlib.h> #include "llist.h" struct queue { struct listnode *head; struct listnode *tail; int size; };
  • 29. Реализация очереди на основе связных списков 29 /* queue_create: Creates an empty queue. */ struct queue *queue_create() { struct queue *q = malloc(sizeof(*q)); if (q != NULL) { q->size = 0; q->head = NULL; q->tail = NULL; } return q; } TCreate = O(1)
  • 30. Реализация очереди на основе связных списков 30 /* queue_free: Removes queue. */ void queue_free(struct queue *q) { while (q->size > 0) queue_dequeue(q); free(q); } TFree = O(n)
  • 31. Реализация очереди на основе связных списков 31 /* queue_size: Returns size of a queue. */ int queue_size(struct queue *q) { return q->size; } int main() { struct queue *q; q = queue_create(); queue_free(q); return 0; } TSize = O(1)
  • 32. Реализация очереди на основе связных списков /* queue_enqueue: Add item to the queue. */ void queue_enqueue(struct queue *q, int value) { struct listnode *oldtail = q->tail; /* Create new node */ q->tail = list_createnode(value); if (q->head == NULL) { /* List is empty */ q->head = q->tail; } else { /* Add new node to the end of list */ oldtail->next = q->tail; } q->size++; } 32 TEnqueue = O(1)
  • 33. Реализация очереди на основе связных списков 33 int main() { struct queue *q; int i; q = queue_create(); for (i = 1; i <= 10; i++) { queue_enqueue(q, i); } printf("Queue size: %dn", queue_size(q)); queue_free(q); return 0; }
  • 34. Реализация очереди на основе связных списков /* queue_dequeue: Gets item from the queue. */ int queue_dequeue(struct queue *q) { int value; struct listnode *p; if (q->size == 0) return -1; /* Delete first node */ value = q->head->value; p = q->head->next; free(q->head); q->head = p; q->size--; return value; } 34TDequeue = O(1)
  • 35. Реализация очереди на основе связных списков int main() { struct queue *q; int i, j; q = queue_create(); /* ... */ for (i = 1; i <= 11; i++) { j = queue_dequeue(q); printf("%d: next element: %dn", i, j); } queue_free(q); return 0; } 35
  • 36. Реализация очереди на основе циклических массивов 36 Элементы очереди хранятся в массиве фиксированной длины [0..L – 1] Массив логически представляется в виде кольца (circular buffer) В пустой очереди Tail = 0, Head = L X Tail Head 0 1 2 L – 1 L
  • 37. Реализация очереди на основе циклических массивов 37 При добавлении элемента в очередь значение Tail циклически увеличивается на 1 (сдвигается на следующую свободную позицию) Если Head = Tail + 1, то очередь переполнена! 1 X Tail Head 0 1 2 3 L – 1 L Enqueue(1):
  • 38. Реализация очереди на основе циклических массивов 38 При удалении возвращается элемент с номером Head % L Значение Head циклически увеличивается на 1 (указывает на следующий элемент очереди) 1 X Tail Head 0 1 2 3 L – 1 L X TailHead 0 1 2 3 L – 1 L Dequeue():
  • 39. Реализация очереди на основе циклических массивов 39 #include <stdio.h> #include <stdlib.h> struct queue { int *v; int head; int tail; int size; int maxsize; };
  • 40. Реализация очереди на основе циклических массивов /* queue_create: Creates an empty queue. */ struct queue *queue_create(int maxsize) { struct queue *q = malloc(sizeof(*q)); if (q != NULL) { q->v = malloc(sizeof(int) * (maxsize + 1)); if (q->v == NULL) { free(q); return NULL; } q->maxsize = maxsize; q->size = 0; q->head = maxsize + 1; q->tail = 0; } return q; } 40 TCreate = O(1)
  • 41. Реализация очереди на основе циклических массивов 41 /* queue_free: Removes queue. */ void queue_free(struct queue *q) { free(q->v); free(q); } /* queue_size: Returns size of a queue. */ int queue_size(struct queue *q) { return q->size; }
  • 42. Реализация очереди на основе циклических массивов /* queue_enqueue: Add item to the queue. */ int queue_enqueue(struct queue *q, int value) { if (q->head == q->tail + 1) { fprintf(stderr, "queue: Queue overflown"); return -1; } q->v[q->tail++] = value; q->tail = q->tail % (q->maxsize + 1); q->size++; return 0; } 42 TEnqueue = O(1)
  • 43. Реализация очереди на основе циклических массивов /* queue_dequeue: Gets item from the queue. */ int queue_dequeue(struct queue *q) { if (q->head % (q->maxsize + 1) == q->tail) { /* Queue is empty */ fprintf(stderr, "queue: Queue is emptyn"); return -1; } q->head = q->head % (q->maxsize + 1); q->size--; return q->v[q->head++]; } TDequeue = O(1) 43
  • 44. Реализация очереди на основе циклических массивов int main() { struct queue *q; int i, val; q = queue_create(10); val = queue_dequeue(q); for (i = 1; i <= 11; i++) { queue_enqueue(q, i); } for (i = 1; i <= 5; i++) { val = queue_dequeue(q); } queue_free(q); return 0; } 44
  • 45. Задание 45 Найти информацию о двухсторонней очереди (дек, deque – double ended queue)