39
правок
Изменения
Дек
,→Циклический дек на динамическом массиве
=== Циклический дек на динамическом массиве ===
Ключевые поля:
* <tex>\mathtt{n}</tex> {{---}} размер массива,
* <tex>\mathtt{d[0\dots n-1]}</tex> {{---}} массив, в котором хранится дек,
* <tex>\mathtt{newDeque[0\dots newSize]}</tex> {{---}} временный массив, где хранятся элементы после перекопирования,
* <tex>\mathtt{d.head}</tex> {{---}} индекс головы дека,
* <tex>\mathtt{d.tail}</tex> {{---}} индекс хвоста,* <tex>\mathtt{capacity}</tex> {{---}} размер массива.
Дек состоит из элементов <tex>\mathtt {d[d.head\dots d.tail-1]}</tex> или <tex>\mathtt {d[0\dots d.tail-1]}</tex> и <tex>\mathtt {d[d.head\dots n-1]}</tex>. Если реализовывать дек на [[Динамический_массив | динамическом массиве]], то мы можем избежать ошибки переполнения. При выполнении операций <tex>\mathtt{pushBack}</tex> и <tex>\mathtt{pushFront}</tex> происходит проверка на переполнение и, если нужно, выделяется большее количество памяти под массив. Также происходит проверка на избыточность памяти, выделенной под дек при выполнении операций <tex>\mathtt{popBack}</tex> и <tex>\mathtt{popFront}</tex>. Если памяти под дек выделено в четыре раза больше размера дека, то массив сокращается в два раза. Для удобства выделим в отдельную функцию <tex>\mathtt{size}</tex> получение текущего размера дека.
'''function''' pushBack(x : '''T'''):
'''if''' (d.head == (d.tail + 1) % n)
'''T''' newDeque[capacity n * 2] '''for''' i = 0 '''to''' capacity n - 1
newDeque[i] = d[d.head]
d.head = (d.head + 1) % n
d = newDeque
d.head = 0
d.tail = capacity n - 1 capacity n = capacity n * 2
d[d.tail] = x
d.tail = (d.tail + 1) % n
'''if''' (empty())
'''return''' <span style="color:red">error</span> "underflow"
'''if''' (size() < capacity n / 4) '''T''' newDeque[capacity n / 2]
'''for''' i = 0 '''to''' size()
newDeque[i] = d[d.head]
d.head = 0
d.tail = size()
d.tail = (d.tail - 1 + n) % n
'''return''' d[d.tail]
'''function''' pushFront(x : '''T'''):
'''if''' (d.head == (d.tail + 1) % n)
'''T''' newDeque[capacity n * 2] '''for''' i = 0 '''to''' capacity n - 1
newDeque[i] = d[d.head]
d.head = (d.head + 1) % n
d = newDeque
d.head = 0
d.tail = capacity n - 1 capacity n = capacity n * 2
d.head = (d.head - 1 + n) % n
d[d.head] = x
'''if''' (empty())
'''return''' <span style="color:red">error</span> "underflow"
'''if''' (size() < capacity n / 4) '''T''' newDeque[capacity n / 2]
'''for''' i = 0 '''to''' size()
newDeque[i] = d[d.head]
d.head = 0
d.tail = size()
'''T''' ret = d[d.head]
d.head = (d.head + 1) % n