double ended queue c with examples
En dybdegående tutorial om Deque eller dobbeltkø i C ++. Selvstudiet forklarer, hvad der er Deque, grundlæggende operationer, C ++ og Java-implementering og applikationer:
Kø med dobbelt ende eller simpelthen kaldet “Deque” er en generaliseret version af kø.
Forskellen mellem kø og Deque er, at den ikke følger FIFO-tilgangen (First In, First Out). Det andet træk ved Deque er, at vi kan indsætte og fjerne elementer fra enten for- eller bagenden.
=> Læs gennem Easy C ++ træningsserien
Hvad du lærer:
- Dobbelt afsluttet køklassificering
- Grundlæggende berøringsfunktioner
- og illustration
- og implementering
- Ansøgninger
- Konklusion
- Anbefalet læsning
Dobbelt afsluttet køklassificering
Deque kan klassificeres som følger:
Indgang med begrænset berøring; I input-begrænset kan sletning ske fra begge ender, men indsættelse kan kun ske i den bageste ende af køen.
Output-begrænset Deque: I den outputbegrænsede kø kan indsættelse ske fra begge ender, men sletning sker kun i den ene ende, dvs. fronten af køen.
Vi kan også implementere stakke og køer ved hjælp af deque.
Grundlæggende berøringsfunktioner
Følgende er de grundlæggende operationer, der kan udføres på deque.
- indsæt front: Indsæt eller tilføj et element på forsiden af billedet.
- indsæt sidst: Indsæt eller tilføj et element bag på skiltet.
- deleteFront: Slet eller fjern elementet foran køen.
- slet sidste: Slet eller fjern elementet bag fra køen.
- getFront: Henter det forreste element i deque.
- getLast: Henter det sidste element i køen.
- er tom: Kontrollerer, om skiltet er tomt.
- er fuld: Kontrollerer, om deque er fuld.
og illustration
En tom deque er repræsenteret som følger:
spørgsmål om webservices interview .net
Derefter indsætter vi element 1 foran.
Nu indsætter vi element 3 bagpå.
Dernæst tilføjer vi element 5 foran, og når de forøges, peger fronten til 4.
bedste temperaturovervågningssoftware windows 10
Derefter indsætter vi elementerne 7 bagpå og 9 foran. Dekken ser ud som vist nedenfor.
Lad os derefter fjerne et element fra forsiden.
Således ser vi, at når elementerne indsættes foran, mindskes frontpositionen, mens den øges, når et element fjernes. I den bageste ende er positionen steget til indsættelse og dekrementeret til fjernelse .
og implementering
100 ++ touch Implementering
Vi kan implementere en deque i C ++ ved hjælp af arrays såvel som en sammenkædet liste. Bortset fra dette har Standard Template Library (STL) en klasse 'deque', der implementerer alle funktionerne til denne datastruktur.
Arrayimplementeringen af deque er givet nedenfor. Da det er en kø med dobbelt ende, har vi brugt cirkulære arrays til implementering.
#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; }
Produktion:
Sæt element 1 i bagenden
indsæt element 3 i bagenden
bageste element i deque 3
Efter forsinkelse, bageste = 1
indsætningselement 5 i forenden
frontelement af deque 5
Efter sletning, front = 1
Genoptælling af Java-implementering
Deque-grænsefladen i Java, 'java.util.Deque' er afledt af 'java.util.Queue' -grænsefladen. Deque kan bruges som en kø (First In, First Out) eller en stack (Last In, First Out). Disse implementeringer fungerer hurtigere end den linkede liste.
Nedenfor er hierarkiet for Deque-grænsefladen i Java.
Vi skal huske et par punkter om Deque-grænsefladen i Java:
- Implementeringen er ikke trådsikker, da der ikke er nogen ekstern synkronisering.
- Deque understøtter ikke samtidighed med flere tråde.
- Deques implementeret ved hjælp af arrays tillader ikke brug af NULL-elementer.
- Arrays får lov til at vokse i henhold til kravene, med begrænsningsfri kapacitet og størrelsesstørrelse til array-understøttelse er de to vigtigste funktioner.
Følgende er de forskellige metoder, der understøttes af Deque-grænsefladen:
hvordan man erklærer listen i java
Ingen. | Metode | Beskrivelse |
---|---|---|
7 | iterator () | Returnerer en iterator til deque. |
en | tilføj (element) | Tilføjer et element til halen. |
to | addFirst (element) | Tilføjer et element til hovedet / fronten. |
3 | addLast (element) | Tilføjer et element til halen / bagsiden. |
4 | tilbud (element) | Tilføjer et element til halen; returnerer en boolsk værdi for at angive, om indsættelsen var vellykket. |
5 | offerFirst (element) | Føjer et element til hovedet; returnerer en boolsk værdi for at angive, om indsættelsen var vellykket. |
6 | offerLast (element) | Tilføjer et element til halen; returnerer en boolsk værdi for at angive, om indsættelsen var vellykket. |
8 | faldendeIterator () | Returnerer en iterator, der har den omvendte rækkefølge for denne deque. |
9 | skub (element) | Tilføjer et element til dequehovedet. |
10 | pop (element) | Fjerner et element fra spidsens hoved og returnerer det. |
elleve | removeFirst () | Fjerner elementet i toppen af deque. |
12 | removeLast () | Fjerner elementet ved halen af deque. |
13 | afstemning() | Henter og fjerner det første element i deque (repræsenteret af deque-hovedet); returnerer NULL, hvis deque er tom. |
14 | pollFirst () | Henter og fjerner det første element i denne deque; returnerer null, hvis denne deque er tom. |
femten | pollLast () | Henter og fjerner det sidste element i denne deque; returnerer null, hvis denne deque er tom. |
16 | kigge () | Henter hovedet (det første element i deque) i køen repræsenteret af denne deque; returnerer null, hvis denne deque er tom. Bemærk: Denne handling fjerner ikke elementet. |
17 | peekFirst () | Henter det første element i denne deque; returnerer null, hvis denne deque er tom. Bemærk: Denne handling fjerner ikke elementet. |
18 | peekLast () | Henter det sidste element i denne deque eller returnerer null, hvis denne deque er tom. Bemærk: Denne handling fjerner ikke elementet. |
Følgende Java-implementering demonstrerer de forskellige operationer, der er diskuteret ovenfor.
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); } }
Produktion:
Og (11, 7, 3, 1, 5, 9, 13)
Standardterator
11 7 3 1 5 9 13
Omvendt Iterator
13 9 5 1 3 7 11
Kig 11
Efter kig: (11, 7, 3, 1, 5, 9, 13)
Pop 11
Efter pop: (7, 3, 1, 5, 9, 13)
Indeholder element 3 ?: sandt
Deque efter fjernelse af første og sidste elementer: (3, 1, 5, 9)
I ovenstående program har vi brugt Deque-grænsefladen til Java, og vi definerede en deque af heltalselementer. Derefter udførte vi forskellige operationer på denne deque og output resultatet af disse operationer vises.
Ansøgninger
Deque kan bruges i nogle af følgende applikationer.
# 1) Planlægningsalgoritme: En planlægningsalgoritme, 'A-stjæle planlægningsalgoritme' implementerer opgaveplanlægning for forskellige processorer i multiprocessorsystemet. Denne implementering bruger deque, og processoren får det første element fra deque til udførelse.
# 2) Fortryd listen over aktiviteter: I softwareapplikationer har vi mange handlinger. Den ene er 'fortryd'. Når vi har udført fortrydelse mange gange, gemmes alle disse handlinger på en liste. Denne liste opretholdes som en deque, så vi let kan tilføje / fjerne poster fra enhver ende.
# 3) Fjern posterne efter nogen tid: Apps opdaterer poster på deres liste som apps, der viser aktieposter osv. Disse apps fjerner posterne efter et stykke tid og indsætter også nye poster. Dette gøres ved hjælp af en deque.
Konklusion
Deque er en kø med dobbelt ende, der giver os mulighed for at tilføje / fjerne elementer fra begge ender, dvs. for og bag, i køen. Deque kan implementeres ved hjælp af arrays eller sammenkædede lister. Vi har dog også en STL-klasse (Standard Template Library), der implementerer de forskellige operationer i Deque.
I Java har vi en Deque-grænseflade, der er nedarvet fra køgrænsefladen for at implementere Deque. Bortset fra Deques grundlæggende standardoperationer understøtter denne grænseflade forskellige andre operationer, der kan udføres på Deque.
Deque bruges generelt til applikationer, der kræver tilføjelse / fjernelse af elementer fra begge ender. Det bruges også mest til planlægning af processorer i multi-processorsystemer.
=> Tjek den komplette C ++ træningsserie