Алгоритмы и структуры данных. Стеки и очереди

Содержание

Слайд 2

Определения

Массив - это однородный, упорядоченный структурированный тип данных с прямым доступом к

Определения Массив - это однородный, упорядоченный структурированный тип данных с прямым доступом
элементам. Элементы массива объединяются общим именем и занимают в компьютере определенную конечную область памяти.
Стек –тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).
Очередь – тип данных, для которых доступ к элементам организован по принципу «первый пришёл — первый вышел» (FIFO, англ. first in, first out).

Слайд 3

Ограничение доступа

Массив – доступ к любому элементу
Стек, очередь – доступ только к

Ограничение доступа Массив – доступ к любому элементу Стек, очередь – доступ
одному элементу.
Интерфейс стеков, очередей проектируется с расчетом на поддержку ограничений доступа. Доступ к другим элементам (по крайней мере теоретически) запрещен.

Слайд 4

Абстракция

Стеки, очереди являются более абстрактными сущностями, чем массивы и многие другие структуры

Абстракция Стеки, очереди являются более абстрактными сущностями, чем массивы и многие другие
данных. Они определяются, прежде всего, своим интерфейсом: набором разрешенных операций, которые могут выполняться с ними. Базовый механизм, используемый для их реализации, обычно остается невидимым для пользователя

Слайд 5

Стек

Абстрактный тип данных, представляющий собой множество элементов, организованных по принципу LIFO (last

Стек Абстрактный тип данных, представляющий собой множество элементов, организованных по принципу LIFO
in — first out, «последним пришёл — первым вышел») называется стеком.

Слайд 6

Основные методы работы со стеком

push – добавление нового элемента в стек
pop –

Основные методы работы со стеком push – добавление нового элемента в стек
извлечение элемента из вершины стека
peek – значение верхнего элемента
empty (new) – создание пустой структуры

Слайд 7

Размер стека

Как правило, стек представляет собой небольшую структуру данных.
Размерность структуры определяется исходя

Размер стека Как правило, стек представляет собой небольшую структуру данных. Размерность структуры
из каких-то практических требований.

Слайд 8

Пример применения стека

Перестановка букв в слове:
Дано слово
Надо вывести в наоборот

Г

О

Р

О

Д

ГОРОД

ДОРОГ

Пример применения стека Перестановка букв в слове: Дано слово Надо вывести в

Слайд 9

Стек. Формальное представление

Но в Java мы не можем пользоваться указателями

Стек. Формальное представление Но в Java мы не можем пользоваться указателями

Слайд 10

Реализация стека в Java

public StackX(int s) { maxSize = s;
stackArray = new

Реализация стека в Java public StackX(int s) { maxSize = s; stackArray
long[maxSize]; top = -1;}
public void push(long j) { stackArray[++top] = j; }
public long pop(){ return stackArray[top--];
}

Слайд 11

Реализация стека в Java (2)

public long peek(){ return stackArray[top];}
public boolean isEmpty(){ return (top

Реализация стека в Java (2) public long peek(){ return stackArray[top];} public boolean
== -1);}
public boolean isFull(){ return (top == maxSize-1);}

Слайд 12

Обработка ошибок

if( !theStack.isFull() )
push(item);
else
System.out.print("Can't insert, stack is full");

Обработка ошибок if( !theStack.isFull() ) push(item); else System.out.print("Can't insert, stack is full");

Слайд 13

Эффективность стеков

Занесение и извлечение элементов из стека выполняется за время O(1).
Иначе

Эффективность стеков Занесение и извлечение элементов из стека выполняется за время O(1).
говоря, время выполнения операции не зависит от количества элементов в стеке. Следовательно, операция выполняется очень быстро, не требуя ни сравнений, ни перемещений.

Слайд 14

Очереди

Структура данных, называемая в информатике очередью, напоминает стек, но в очереди первым

Очереди Структура данных, называемая в информатике очередью, напоминает стек, но в очереди
извлекается элемент, вставленный первым (FIFO, First-In-First-Out), тогда как в стеке, как мы видели, первым извлекается элемент, вставленный последним (LIFO).

*Изображение взято с сайта:
https://www.code-brew.com

Слайд 15

Методы очереди

enqueue — добавление элемента в очередь;
dequeue — удаления элемента из очереди
new – создание

Методы очереди enqueue — добавление элемента в очередь; dequeue — удаления элемента
пустой очереди
peek - получение элемента без удаления

Слайд 16

Очередь. Формальное представление

Выделяют два способа программной реализации очереди. Первый из них основан

Очередь. Формальное представление Выделяют два способа программной реализации очереди. Первый из них
на базе массива, а второй на базе указателей (связного списка). Первый способ – статический, т. к. очередь представляется в виде простого статического массива, второй – динамический.

Слайд 17

Реализация очереди в Java 1*

private int maxSize; private long[] queArray; private int front; private int

Реализация очереди в Java 1* private int maxSize; private long[] queArray; private
rear; private int nItems;
public Queue(int s){ maxSize = s; queArray = new long[maxSize]; front = 0; rear = -1; nItems = 0;}

Слайд 18

Реализация очереди в Java 2*

public void insert(long j){ if(rear == maxSize-1) rear = -1; queArray[++rear]

Реализация очереди в Java 2* public void insert(long j){ if(rear == maxSize-1)
= j; nItems++;}
public long remove(){ long temp = queArray[front++]; if(front == maxSize) front = 0; nItems--;
return temp;}

Слайд 19

Реализация очереди в Java 3*

public long peekFront() {
return queArray[front];}
public boolean isEmpty(){ return (nItems==0);}

Реализация очереди в Java 3* public long peekFront() { return queArray[front];} public

public boolean isFull() {
return (nItems==maxSize);}
public int size(){ return nItems;}

Слайд 20

Реализация очереди без счетчика элементов 1*

private int maxSize;
private long[] queArray;
private int front;
private

Реализация очереди без счетчика элементов 1* private int maxSize; private long[] queArray;
int rear;
public Queue(int s) { maxSize = s+1;
queArray = new long[maxSize]; front = 0; rear = -1;}

Слайд 21

Реализация очереди без счетчика элементов 2*

public void insert(long j) {
if(rear == maxSize-1)
rear

Реализация очереди без счетчика элементов 2* public void insert(long j) { if(rear
= -1;
queArray[++rear] = j;}
public long remove(){ long temp = queArray[front++]; if(front == maxSize) front = 0; return temp;}

Слайд 22

Реализация очереди без счетчика элементов 3*

public long peek(){ return queArray[front];}
public boolean isEmpty(){ return

Реализация очереди без счетчика элементов 3* public long peek(){ return queArray[front];} public
( rear+1==front || (front+maxSize-1==rear) );}
public boolean isFull() {
return ( rear+2==front || (front+maxSize-2==rear) ) }
public int size() { if(rear >= front)
return rear-front+1; else
return (maxSize-front) + (rear+1);}

Слайд 23

Эффективность очередей

Вставка и извлечение элементов очереди, как и элементов стека, выполняются за

Эффективность очередей Вставка и извлечение элементов очереди, как и элементов стека, выполняются за время O(1).
время O(1).

Слайд 24

Дек

Дек (deque) представляет собой двустороннюю очередь.
И вставка, и удаление элементов могут

Дек Дек (deque) представляет собой двустороннюю очередь. И вставка, и удаление элементов
производиться с обоих концов.

Слайд 25

Приоритетные очереди

Очередь с приоритетом (Priority queue) – очередь, в которой элементы имеют

Приоритетные очереди Очередь с приоритетом (Priority queue) – очередь, в которой элементы
приоритет (вес)
Поддерживаемые операции:
Insert(key, value) – добавление элемента в очередь
DeleteMin/DeleteMax – удаляет из очереди элемент с мин./макс. ключом
Min/Max – возвращает элемент с мин./макс. ключом
DecreaseKey – изменяет значение ключа элемента
Merge(q1, q2) – сливает две очереди в одну

Слайд 26

Структуры данных, лежащих в основе ПРИОРИТЕТНОЙ ОЧЕРДИ

Куча
Массив

Структуры данных, лежащих в основе ПРИОРИТЕТНОЙ ОЧЕРДИ Куча Массив

Слайд 27

Пример реализации 1* (на основе массива)

private int maxSize;
private long[] queArray;
private int nItems;
public

Пример реализации 1* (на основе массива) private int maxSize; private long[] queArray;
PriorityQ(int s)
{maxSize = s;
queArray = new long[maxSize];
nItems = 0;}

Слайд 28

Пример реализации 2*

public void insert(long item) {
int j;
if(nItems==0)
queArray[nItems++] = item;

Пример реализации 2* public void insert(long item) { int j; if(nItems==0) queArray[nItems++]

else {
for(j=nItems-1; j>=0; j--) {
if( item > queArray[j] )
queArray[j+1] = queArray[j];
else
break; }
queArray[j+1] = item; // Вставка элемента
nItems++;
}}

Слайд 29

Пример реализации 3*

public long remove() { return queArray[--nItems]; }
public long peekMin() {
return

Пример реализации 3* public long remove() { return queArray[--nItems]; } public long
queArray[nItems-1]; }
public boolean isEmpty() { return (nItems==0); }
public boolean isFull() { return (nItems == maxSize); }