double ended queue c with examples
Un tutorial approfondito su Deque o Double-ended Queue in C ++. Il tutorial spiega cos'è Deque, operazioni di base, implementazione e applicazioni C ++ e Java:
La coda doppia o chiamata semplicemente 'Deque' è una versione generalizzata di Queue.
La differenza tra Queue e Deque è che non segue l'approccio FIFO (First In, First Out). La seconda caratteristica di Deque è che possiamo inserire e rimuovere elementi dalle estremità anteriori o posteriori.
=> Leggere la serie di formazione Easy C ++
Cosa imparerai:
- Classificazione delle code doppie
- Operazioni tattili di base
- e illustrazione
- e implementazione
- Applicazioni
- Conclusione
- Lettura consigliata
Classificazione delle code doppie
Deque può essere classificato come segue:
Input limitato al tocco; Con le restrizioni di input, l'eliminazione può essere eseguita da entrambe le estremità, ma l'inserimento può essere eseguito solo dall'estremità posteriore della coda.
Deque con limitazione in uscita: Nella coda con limitazioni di output, l'inserimento può essere eseguito da entrambe le estremità, ma l'eliminazione viene eseguita solo a un'estremità, ovvero il front-end della coda.
Possiamo anche implementare stack e code usando deque.
Operazioni tattili di base
Le seguenti sono le operazioni di base che possono essere eseguite su deque.
- inserto frontale: Inserisci o aggiungi un elemento nella parte anteriore del deque.
- insertLast: Inserisci o aggiungi un elemento sul retro del deque.
- deleteFront: Elimina o rimuovi l'elemento dalla parte anteriore della coda.
- cancella ultimo: Elimina o rimuovi l'elemento dal retro della coda.
- getFront: Recupera l'elemento in primo piano nel deque.
- getLast: Recupera l'ultimo elemento nella coda.
- è vuoto: Controlla se il deque è vuoto.
- è pieno: Controlla se il deque è pieno.
e illustrazione
Un deque vuoto è rappresentato come segue:

elenco dei server privati di world of warcraft
Successivamente, inseriamo l'elemento 1 nella parte anteriore.

Ora inseriamo l'elemento 3 sul retro.

Successivamente, aggiungiamo l'elemento 5 in primo piano e quando incrementiamo i punti frontali a 4.

Quindi, inseriamo gli elementi 7 nella parte posteriore e 9 nella parte anteriore. Il deque apparirà come mostrato di seguito.
Quindi, rimuoviamo un elemento dalla parte anteriore.

Quindi, vediamo che quando gli elementi vengono inseriti frontalmente, la posizione frontale viene decrementata mentre viene incrementata quando un elemento viene rimosso. Per l'estremità posteriore, la posizione viene incrementata per l'inserimento e decrementata per la rimozione .
e implementazione
100 ++ tocco implementazione
Possiamo implementare una deque in C ++ utilizzando array e una lista collegata. Oltre a questo, la Standard Template Library (STL) ha una classe 'deque' che implementa tutte le funzioni per questa struttura dati.
L'implementazione dell'array del deque è stata fornita di seguito. Poiché si tratta di una coda a doppia estremità, abbiamo utilizzato array circolari per l'implementazione.
#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; } Produzione:
Inserire l'elemento 1 all'estremità posteriore
inserire l'elemento 3 all'estremità posteriore
elemento posteriore del deque 3
Dopo deleterear, rear = 1
inserimento dell'elemento 5 all'estremità anteriore
qa testare le domande e le risposte dell'intervista per esperti
elemento anteriore del deque 5
Dopo deletefront, front = 1

Riconteggio dell'implementazione Java
L'interfaccia deque in Java, 'java.util.Deque', deriva dall'interfaccia 'java.util.Queue'. Deque può essere utilizzato come coda (First In, First Out) o come stack (Last In, First Out). Queste implementazioni funzionano più velocemente dell'elenco collegato.
Di seguito è riportata la gerarchia per l'interfaccia Deque in Java.

Dobbiamo ricordare alcuni punti sull'interfaccia Deque in Java:
- L'implementazione non è thread-safe poiché non c'è sincronizzazione esterna.
- Deque non supporta la concorrenza di più thread.
- Deque's implementato utilizzando array non consente l'uso di elementi NULL.
- Gli array possono crescere in base ai requisiti, con la capacità senza restrizioni e il supporto per array ridimensionabile come le due caratteristiche più importanti.
Di seguito sono riportati i vari metodi supportati dall'interfaccia Deque:
domande di intervista unix per il supporto alla produzione
| Non. | Metodo | Descrizione |
|---|---|---|
| 7 | iteratore () | Restituisce un iteratore per deque. |
| 1 | aggiungi (elemento) | Aggiunge un elemento alla coda. |
| Due | addFirst (elemento) | Aggiunge un elemento alla testa / davanti. |
| 3 | addLast (elemento) | Aggiunge un elemento alla coda / posteriore. |
| 4 | offerta (elemento) | Aggiunge un elemento alla coda; restituisce un valore booleano per indicare se l'inserimento è andato a buon fine. |
| 5 | offerFirst (elemento) | Aggiunge un elemento alla testa; restituisce un valore booleano per indicare se l'inserimento è andato a buon fine. |
| 6 | offerLast (elemento) | Aggiunge un elemento alla coda; restituisce un valore booleano per indicare se l'inserimento è andato a buon fine. |
| 8 | descendingIterator () | Restituisce un iteratore che ha l'ordine inverso per questo deque. |
| 9 | push (elemento) | Aggiunge un elemento alla testa del deque. |
| 10 | pop (elemento) | Rimuove un elemento dalla testa del deque e lo restituisce. |
| undici | removeFirst () | Rimuove l'elemento in testa al deque. |
| 12 | removeLast () | Rimuove l'elemento in coda alla deque. |
| 13 | sondaggio() | Recupera e rimuove il primo elemento del deque (rappresentato dalla testa del deque); restituisce NULL se il deque è vuoto. |
| 14 | pollFirst () | Recupera e rimuove il primo elemento di questo deque; restituisce null se questo deque è vuoto. |
| quindici | pollLast () | Recupera e rimuove l'ultimo elemento di questo deque; restituisce null se questo deque è vuoto. |
| 16 | sbirciare() | Recupera la testa (primo elemento del deque) della coda rappresentata da questo deque; restituisce null se questo deque è vuoto. Nota: questa operazione non rimuove l'elemento. |
| 17 | peekFirst () | Recupera il primo elemento di questo deque; restituisce null se questo deque è vuoto. Nota: questa operazione non rimuove l'elemento. |
| 18 | peekLast () | Recupera l'ultimo elemento di questo deque o restituisce null se questo deque è vuoto. Nota: questa operazione non rimuove l'elemento. |
La seguente implementazione Java mostra le varie operazioni discusse sopra.
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); } } Produzione:
E il (11, 7, 3, 1, 5, 9, 13)
Iteratore standard
11 7 3 1 5 9 13
Iteratore inverso
13 9 5 1 3 7 11
Sbircia 11
Dopo l'anteprima: (11, 7, 3, 1, 5, 9, 13)
Pop 11
Dopo il pop: (7, 3, 1, 5, 9, 13)
Contiene l'elemento 3 ?: vero
Deque dopo aver rimosso il primo e l'ultimo elemento: (3, 1, 5, 9)

Nel programma precedente, abbiamo utilizzato l'interfaccia Deque di Java e abbiamo definito una deque di elementi interi. Quindi abbiamo eseguito varie operazioni su questo deque e vengono visualizzati i risultati di queste operazioni.
Applicazioni
Deque può essere utilizzato in alcune delle seguenti applicazioni.
# 1) Algoritmo di pianificazione: Un algoritmo di pianificazione, 'Algoritmo di pianificazione A-steal', implementa la pianificazione delle attività per vari processori nel sistema multiprocessore. Questa implementazione usa deque e il processore ottiene il primo elemento da deque per l'esecuzione.
# 2) Annulla elenco di attività: Nelle applicazioni software, abbiamo molte azioni. Uno è 'annulla'. Quando abbiamo eseguito un'azione di annullamento molte volte, tutte queste azioni vengono memorizzate in un elenco. Questo elenco è mantenuto come deque in modo che possiamo facilmente aggiungere / rimuovere voci da qualsiasi estremità.
# 3) Rimuovi le voci dopo un po 'di tempo: Le app aggiornano le voci nel loro elenco come le app che elencano le voci di borsa, ecc. Queste app rimuovono le voci dopo qualche tempo e inseriscono anche nuove voci. Questo viene fatto usando un deque.
Conclusione
Deque è una coda a doppia estremità che ci consente di aggiungere / rimuovere elementi da entrambe le estremità, cioè davanti e dietro, della coda. Deque può essere implementato utilizzando array o elenchi collegati. Tuttavia, abbiamo anche una classe STL (Standard Template Library) che implementa le varie operazioni del Deque.
In Java, abbiamo un'interfaccia Deque che viene ereditata dall'interfaccia della coda per implementare Deque. Oltre alle operazioni standard di base di Deque, questa interfaccia supporta varie altre operazioni che possono essere eseguite su Deque.
Deque è generalmente utilizzato per applicazioni che richiedono l'aggiunta / rimozione di elementi da entrambe le estremità. Viene anche utilizzato principalmente nella pianificazione dei processori in sistemi multiprocessore.
=> Dai un'occhiata alla serie completa di formazione C ++
Lettura consigliata
- Coda prioritaria in AWL
- Che cos'è il test di confronto (impara con esempi)
- Tutorial Python DateTime con esempi
- Ordinamento della shell in C ++ con esempi
- Comando Taglia in Unix con esempi
- Sintassi dei comandi Cat Unix, opzioni con esempi
- Utilizzo del cursore in MongoDB con esempi
- Comando Ls in Unix con esempi