double ended queue c with examples
Детаљни водич о Декуе или двоструком реду у Ц ++-у. Водич објашњава шта је Декуе, основне операције, примена Ц ++ и Јава и апликације:
Двоструко завршен ред или једноставно назван „Декуе“ је генерализована верзија реда.
Разлика између Куеуе и Декуе је у томе што се не придржава ФИФО (Фирст Ин, Фирст Оут) приступа. Друга карактеристика Декуе-а је да можемо уметнути и уклонити елементе са предњег или задњег краја.
=> Прочитајте серију Еаси Ц ++ Траининг Сериес
Шта ћете научити:
- Класификација двоструког завршетка
- Основне операције додира
- и Илустрација
- и Имплементација
- Апликације
- Закључак
- Препоручено читање
Класификација двоструког завршетка
Декуе се може класификовати на следећи начин:
Улаз са ограниченим додиром; У ограниченом улазу, брисање се може обавити са оба краја, али уметање се може извршити само на задњем крају реда.
Излазно ограничени Декуе: У излазно ограниченом реду, уметање се може обавити са оба краја, али брисање се врши само на једном крају, тј. Предњем крају реда.
Такође можемо применити стекове и редове користећи декуе.
Основне операције додира
Следе основне операције које се могу изводити на декуе-у.
- убаци предњи део: Уметните или додајте предмет на предњој страни деке.
- инсертЛаст: Уметните или додајте предмет на задњој страни деке.
- делетеФронт: Избришите или уклоните ставку са чела реда.
- избриши последње: Избришите или уклоните ставку са задње стране реда.
- гетФронт: Дохваћа предњу ставку у декуеу.
- гетЛаст: Дохваћа последњу ставку у реду.
- Празно: Проверава да ли је декуе празан.
- је пун: Проверава да ли је декуе пун.
и Илустрација
Празни декуе је представљен на следећи начин:
јава прослеђује низ методу референцом
Даље, убацујемо елемент 1 са предње стране.
Сада убацујемо елемент 3 позади.
Даље, додајемо елемент 5 напред и када се предње тачке увећавају на 4.
Затим убацујемо елементе 7 позади и 9 напред. Декуе ће изгледати као што је приказано доле.
Даље, уклонимо елемент са предње стране.
Дакле, видимо да када се елементи уметну напред, предњи положај се смањује док се повећава када се елемент уклања. За задњи крај, положај се повећава за уметање и смањује за уклањање .
и Имплементација
Имплементација 100 ++ тоуцх
У Ц ++ можемо применити декуе користећи низове као и повезану листу. Поред тога, Стандард Темплате Либрари (СТЛ) има класу „декуе“ која имплементира све функције за ову структуру података.
Имплементација низа декуе-а дата је у наставку. Како се ради о двоструком реду, за примену смо користили кружне низове.
#include using namespace std; #define MAX_size 10 // Maximum size of array or Dequeue // Deque class class Deque { int array(MAX_size); int front; int rear; int size; public : Deque(int size) { front = -1; rear = 0; this->size = size; } // Operations on Deque: void insertfront(int key); void insertrear(int key); void deletefront(); void deleterear(); int getFront(); int getRear(); // Check if Deque is full bool isFull()front == rear+1); // Check if Deque is empty bool isEmpty(){ return (front == -1); } }; // Insert an element at front of the deque void Deque::insertfront(int key) { if (isFull()) { cout << 'Overflow!!
' << endl; return; } // If queue is initially empty,set front=rear=0; start of deque if (front == -1) { front = 0; rear = 0; } else if (front == 0) // front is first position of queue front = size - 1 ; else // decrement front 1 position front = front-1; array(front) = key ; // insert current element into Deque } // insert element at the rear end of deque void Deque ::insertrear(int key) { if (isFull()) { cout << ' Overflow!!
' << endl; return; } // If queue is initially empty,set front=rear=0; start of deque if (front == -1) { front = 0; rear = 0; } else if (rear == size-1) // rear is at last position of queue rear = 0; else // increment rear by 1 position rear = rear+1; array(rear) = key ; // insert current element into Deque } // Delete element at front of Deque void Deque ::deletefront() { if (isEmpty()) { cout << 'Queue Underflow!!
' << endl; return ; } // Deque has only one element if (front == rear) { front = -1; rear = -1; } else // back to initial position if (front == size -1) front = 0; else // remove current front value from Deque;increment front by 1 front = front+1; } // Delete element at rear end of Deque void Deque::deleterear() { if (isEmpty()) { cout << ' Underflow!!
' << endl ; return ; } // Deque has only one element if (front == rear) { front = -1; rear = -1; } else if (rear == 0) rear = size-1; else rear = rear-1; } // retrieve front element of Deque int Deque::getFront() { if (isEmpty()) { cout << ' Underflow!!
' << endl; return -1 ; } return array(front); } // retrieve rear element of Deque int Deque::getRear() { if(isEmpty() || rear < 0) { cout << ' Underflow!!
' << endl; return -1 ; } return array(rear); } //main program int main() { Deque dq(5); cout << 'Insert element 1 at rear end
'; dq.insertrear(1); cout << 'insert element 3 at rear end
'; dq.insertrear(3); cout << 'rear element of deque ' << ' ' << dq.getRear() << endl; dq.deleterear(); cout << 'After deleterear, rear = ' << dq.getRear() << endl; cout << 'inserting element 5 at front end
'; dq.insertfront(5); cout << 'front element of deque ' << ' ' << dq.getFront() << endl; dq.deletefront(); cout << 'After deletefront, front = ' << dq.getFront() << endl; return 0; }
Излаз:
Уметните елемент 1 на задњи крај
уметните елемент 3 на задњи крај
задњи елемент декуе 3
После делетереара, задњи = 1
убацивање елемента 5 на предњи крај
предњи елемент декуе 5
Након делетефронт, фронт = 1
Пребројавање имплементације Јаве
Декуе интерфејс у Јави, „јава.утил.Декуе“ изведен је из интерфејса „јава.утил.Куеуе“. Декуе се може користити као ред (први улаз, први излаз) или скуп (последњи улаз, први излаз). Ове имплементације раде брже од повезане листе.
алати за пробијање лозинки за Виндовс 7
Доље је дата хијерархија за Декуе интерфејс у Јави.
Морамо да запамтимо неколико тачака о интерфејсу Декуе у Јави:
- Имплементација није сигурна у нити јер не постоји спољна синхронизација.
- Декуе не подржава паралелност у више нити.
- Декуе-ови примењени низовима не дозвољавају употребу НУЛЛ елемената.
- Низовима је дозвољено да расту према захтевима, при чему су две најважније карактеристике капацитет без ограничења и подршка низа који се може променити.
Следе различити начини које подржава интерфејс Декуе:
шта је добар музички довнлоадер за андроид
Немој. | Метод | Опис |
---|---|---|
7 | итератор () | Враћа итератор за декуе. |
1 | додај (елемент) | Додаје елемент у реп. |
два | аддФирст (елемент) | Додаје елемент у главу / напред. |
3 | аддЛаст (елемент) | Додаје елемент у реп / задњи део. |
4 | понуда (елемент) | Додаје елемент у реп; враћа логичку вредност која показује да ли је уметање успешно. |
5 | офферФирст (елемент) | Додаје елемент у главу; враћа логичку вредност која показује да ли је уметање успешно. |
6 | офферЛаст (елемент) | Додаје елемент у реп; враћа логичку вредност која показује да ли је уметање успешно. |
8 | десцендингИтератор () | Враћа итератор који има обрнути редослед за овај декуе. |
9 | пусх (елемент) | Додаје елемент у главу декуе-а. |
10 | поп (елемент) | Уклања елемент са главе декуе-а и враћа га. |
Једанаест | ремовеФирст () | Уклања елемент на челу деке. |
12 | ремовеЛаст () | Уклања елемент на репу декуе-а. |
13 | анкета () | Дохваћа и уклања први елемент декуе-а (представљен главом декуе-а); враћа НУЛЛ ако је декуе празан. |
14 | поллФирст () | Дохваћа и уклања први елемент ове декуе; враћа нулл ако је овај декуе празан. |
петнаест | поллЛаст () | Дохваћа и уклања последњи елемент овог декуе-а; враћа нулл ако је овај декуе празан. |
16 | завирити () | Дохваћа главу (први елемент декуе-а) реда који представља овај декуе; враћа нулл ако је овај декуе празан. Напомена: Ова операција не уклања елемент. |
17 | пеекФирст () | Дохваћа први елемент овог декуе-а; враћа нулл ако је овај декуе празан. Напомена: Ова операција не уклања елемент. |
18 | пеекЛаст () | Дохваћа последњи елемент овог декуе-а или враћа нулл ако је овај декуе празан. Напомена: Ова операција не уклања елемент. |
Следећа имплементација Јаве демонстрира различите операције о којима је раније било речи.
import java.util.*; class Main { public static void main(String() args) { Deque deque = new LinkedList (); // We can add elements to the queue in various ways deque.add(1); // add to tail deque.addFirst(3); deque.addLast(5); deque.push(7); //add to head deque.offer(9); deque.offerFirst(11); deque.offerLast(13); System.out.println('The deque : ' + deque + '
'); // Iterate through the queue elements. System.out.println('Standard Iterator'); Iterator iterator = deque.iterator(); while (iterator.hasNext()) System.out.print(' ' + iterator.next()); // Reverse order iterator Iterator reverse = deque.descendingIterator(); System.out.println('
Reverse Iterator'); while (reverse.hasNext()) System.out.print(' ' + reverse.next()); // Peek returns the head, without deleting // it from the deque System.out.println('
Peek ' + deque.peek()); System.out.println('After peek: ' + deque); // Pop returns the head, and removes it from // the deque System.out.println('
Pop ' + deque.pop()); System.out.println('After pop: ' + deque); // We can check if a specific element exists // in the deque System.out.println('
Contains element 3?: ' + deque.contains(3)); // We can remove the first / last element. deque.removeFirst(); deque.removeLast(); System.out.println('Deque after removing ' + 'first and last elements: ' + deque); } }
Излаз:
И (11, 7, 3, 1, 5, 9, 13)
Стандард Итератор
11 7 3 1 5 9 13
Обрнути итератор
13 9 5 1 3 7 11
Завири 11
Након завирења: (11, 7, 3, 1, 5, 9, 13)
Поп 11
Афтер поп: (7, 3, 1, 5, 9, 13)
Садржи елемент 3 ?: тачно
Декуе након уклањања првог и последњег елемента: (3, 1, 5, 9)
У горњем програму смо користили Декуе интерфејс Јава и дефинисали смо декуе целобројних елемената. Затим смо извршили разне операције на овом декуеу и приказали смо резултате тих операција.
Апликације
Декуе се може користити у неким од следећих апликација.
# 1) Алгоритам заказивања: Алгоритам распоређивања, „А-украдите алгоритам заказивања“, примењује заказивање задатака за различите процесоре у вишепроцесорском систему. Ова имплементација користи декуе, а процесор добија први елемент из декуе-а за извршење.
# 2) Опозови списак активности: У софтверским апликацијама имамо много радњи. Једно је „поништи“. Када смо више пута извршили радњу поништавања, све ове радње се чувају на листи. Ова листа се одржава као декуе тако да можемо лако додавати / уклањати уносе са било ког краја.
# 3) Уклоните уносе након неког времена: Апликације освежавају уносе на њиховој листи, попут апликација које наводе уносе залиха итд. Ове апликације уклањају уносе након неког времена и такође убацују нове уносе. Ово се ради помоћу декуе-а.
Закључак
Декуе је двоструки ред који нам омогућава додавање / уклањање елемената са оба краја, односно предњег и задњег дела реда. Декуе се може применити помоћу низова или повезаних листа. Међутим, имамо и класу Стандард Темплате Либрари (СТЛ) која примењује различите операције Декуе-а.
У Јави имамо Декуе интерфејс који се наслеђује од интерфејса редова за примену Декуеа. Поред основних стандардних операција Декуе-а, овај интерфејс подржава и друге друге операције које се могу извршити на Декуе-у.
Декуе се обично користи за апликације које захтевају додавање / уклањање елемената са оба краја. Такође се највише користи за планирање процесора у вишепроцесорским системима.
=> Погледајте комплетну серију обука за Ц ++
Препоручено читање
- Редослед приоритета у СТЛ-у
- Шта је упоредно тестирање (научите на примерима)
- Питхон ДатеТиме Водич са примерима
- Сортирање љуске на Ц ++ са примерима
- Изрежи команду у Унику са примерима
- Синтакса наредбе Уник Цат, опције са примерима
- Употреба курсора у МонгоДБ са примерима
- Лс наредба у Унику са примерима