Алгоритмы и структуры данных для начинающих: стеки и очереди


Хранение элементов в массиве


Download 81.5 Kb.
bet7/10
Sana04.02.2023
Hajmi81.5 Kb.
#1162666
TuriЛекция
1   2   3   4   5   6   7   8   9   10
Bog'liq
Алгоритмы и структуры данных для начинающих

Хранение элементов в массиве
Как уже было упомянуто, у реализации очереди с использованием массива есть свои преимущества. Она выглядит простой, но на самом деле есть ряд нюансов, которые надо учесть.
Давайте посмотрим на проблемы, которые могут возникнуть, и на их решение. Кроме того, нам понадобится информация об увеличении внутреннего массива из прошлой статьи о динамических массивах.
При создании очереди у нее внутри создается массив нулевой длины. Красные буквы «h» и «t» означают указатели _head и _tail соответственно.
Deque deq = new Deque();
deq.EnqueueFirst(1);

Добавляем элемент в начало
deq.EnqueueLast(2);

Добавляем элемент в конец
deq.EnqueueFirst(0);

Добавляем еще один элемент в начало
Обратите внимание: индекс «головы» очереди перескочил в начало списка. Теперь первый элемент, который будет возвращен при вызове метода DequeueFirst — 0 (индекс 3).
deq.EnqueueLast(3);

И еще один в конец
Массив заполнен, поэтому при добавлении элемента произойдет следующее:

  • Алгорим роста определит размер нового массива.

  • Элементы скопируются в новый массив с «головы» до «хвоста».

  • Добавится новый элемент.

deq.EnqueueLast(4);

Добавляем значение в конец расширенного массива
Теперь посмотрим, что происходит при удалении элемента:
deq.DequeueFirst();

Удаляем элемент из начала
deq.DequeueLast();

Удаляем элемент с конца
Ключевой момент: вне зависимости от вместимости или заполненности внутреннего массива, логически, содержимое очереди — элементы от «головы» до «хвоста» с учетом «закольцованности». Такое поведение также называется «кольцевым буфером».
Теперь давайте посмотрим на реализацию.
Класс Deque (с использованием массива)
Интерфейс очереди на основе массива такой же, как и в случае реализации через связный список. Мы не будем его повторять. Однако, поскольку список был заменен на массив, у нас добавились новые поля — сам массив, его размер и указатели на «хвост» и «голову» очереди.
public class Deque
{
T[] _items = new T[0];

// Количество элементов в очереди.


int _size = 0;

// Индекс первого (самого старого) элемента.


int _head = 0;

// Индекс последнего (самого нового) элемента.


int _tail = -1;
...
}

Download 81.5 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   10




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling