Σε αυτό το σεμινάριο, θα μάθετε τι είναι η ουρά διπλού άκρου (deque). Επίσης, θα βρείτε παραδείγματα εργασίας διαφορετικών λειτουργιών σε ένα deque σε C, C ++, Java και Python.
Το Deque ή το Double Ended Queue είναι ένας τύπος ουράς στην οποία η εισαγωγή και η αφαίρεση στοιχείων μπορούν να πραγματοποιηθούν είτε από το μπροστινό είτε από το πίσω μέρος. Έτσι, δεν ακολουθεί τον κανόνα FIFO (First In First Out).

Τύποι Deque
- Input Restricted Deque
Σε αυτό το deque, η είσοδος περιορίζεται σε ένα μόνο άκρο αλλά επιτρέπει τη διαγραφή και στα δύο άκρα. - Output Restricted Deque
Σε αυτό το deque, η έξοδος περιορίζεται σε ένα άκρο αλλά επιτρέπει την εισαγωγή και στα δύο άκρα.
Λειτουργίες σε Deque
Ακολουθεί η εφαρμογή του κυκλικού πίνακα του deque. Σε έναν κυκλικό πίνακα, εάν ο πίνακας είναι πλήρης, ξεκινάμε από την αρχή.
Αλλά σε μια γραμμική υλοποίηση πίνακα, εάν ο πίνακας είναι πλήρης, δεν μπορούν να εισαχθούν άλλα στοιχεία. Σε καθεμία από τις παρακάτω λειτουργίες, εάν ο πίνακας είναι πλήρης, εμφανίζεται το "μήνυμα υπερχείλισης".
Πριν εκτελέσετε τις ακόλουθες λειτουργίες, ακολουθείτε αυτά τα βήματα.
- Πάρτε μια συστοιχία (deque) μεγέθους n.
- Ορίστε δύο δείκτες στην πρώτη θέση και ορίστε
front = -1
καιrear = 0
.

1. Εισάγετε στο μπροστινό μέρος
Αυτή η λειτουργία προσθέτει ένα στοιχείο στο μπροστινό μέρος.
- Ελέγξτε τη θέση του εμπρός.
Ελέγξτε τη θέση του εμπρός
- Εάν
front < 1
, επανεκκίνησηfront = n-1
(τελευταίο ευρετήριο).Μετακινηθείτε μπροστά στο τέλος
- Διαφορετικά, μειώστε μπροστά κατά 1.
- Προσθέστε το νέο κλειδί 5 στο
array(front)
.Εισαγάγετε το στοιχείο στο μπροστινό μέρος
2. Εισαγάγετε στο πίσω μέρος
Αυτή η λειτουργία προσθέτει ένα στοιχείο στο πίσω μέρος.
- Ελέγξτε εάν ο πίνακας είναι πλήρης.
Ελέγξτε εάν το deque είναι γεμάτο
- Εάν το deque είναι γεμάτο, επανεκκινήστε
rear = 0
. - Αλλιώς, αυξήστε το πίσω κατά 1.
Αυξήστε το πίσω
- Προσθέστε το νέο κλειδί 5 στο
array(rear)
.Τοποθετήστε το στοιχείο στο πίσω μέρος
3. Διαγράψτε από το μπροστινό μέρος
Η λειτουργία διαγράφει ένα στοιχείο από μπροστά.
- Ελέγξτε εάν το deque είναι άδειο.
Ελέγξτε εάν το deque είναι άδειο
- Εάν το deque είναι κενό (δηλ.
front = -1
), Δεν είναι δυνατή η διαγραφή ( κατάσταση underflow ) - Εάν η deque έχει μόνο ένα στοιχείο (δηλαδή
front = rear
), ορίστεfront = -1
καιrear = -1
. - Διαφορετικά, εάν το μπροστινό μέρος είναι στο τέλος (δηλαδή
front = n - 1
), μεταβείτε στο μπροστινό μέροςfront = 0
. - Αλλιώς,
front = front + 1
.Αυξήστε το μέτωπο
4. Διαγράψτε από το πίσω μέρος
Αυτή η λειτουργία διαγράφει ένα στοιχείο από πίσω.
- Ελέγξτε εάν το deque είναι άδειο.
Ελέγξτε εάν το deque είναι άδειο
- Εάν το deque είναι κενό (δηλ.
front = -1
), Δεν είναι δυνατή η διαγραφή ( κατάσταση underflow ) - Εάν η deque έχει μόνο ένα στοιχείο (δηλαδή
front = rear
), ορίστεfront = -1
καιrear = -1
, αλλιώς ακολουθήστε τα παρακάτω βήματα. - Εάν το πίσω μέρος είναι μπροστά (δηλ.
rear = 0
), Ρυθμίστε το προς τα εμπρόςrear = n - 1
. - Αλλιώς,
rear = rear - 1
.Μειώστε το πίσω μέρος
5. Επιλέξτε Άδειασμα
Αυτή η λειτουργία ελέγχει εάν το deque είναι κενό. Εάν front = -1
, το deque είναι άδειο.
6. Έλεγχος πλήρους
Αυτή η λειτουργία ελέγχει εάν το deque είναι γεμάτο. Εάν front = 0
και rear = n - 1
OR front = rear + 1
, η deque είναι γεμάτη.
Εφαρμογή Deque σε Python, Java, C και C ++
Python Java C C ++ # Deque implementaion in python class Deque: def __init__(self): self.items = () def isEmpty(self): return self.items == () def addRear(self, item): self.items.append(item) def addFront(self, item): self.items.insert(0, item) def removeFront(self): return self.items.pop() def removeRear(self): return self.items.pop(0) def size(self): return len(self.items) d = Deque() print(d.isEmpty()) d.addRear(8) d.addRear(5) d.addFront(7) d.addFront(10) print(d.size()) print(d.isEmpty()) d.addRear(11) print(d.removeRear()) print(d.removeFront()) d.addFront(55) d.addRear(45) print(d.items)
// Deque implementation in Java class Deque ( static final int MAX = 100; int arr(); int front; int rear; int size; public Deque(int size) ( arr = new int(MAX); front = -1; rear = 0; this.size = size; ) boolean isFull() ( return ((front == 0 && rear == size - 1) || front == rear + 1); ) boolean isEmpty() ( return (front == -1); ) void insertfront(int key) ( if (isFull()) ( System.out.println("Overflow"); return; ) if (front == -1) ( front = 0; rear = 0; ) else if (front == 0) front = size - 1; else front = front - 1; arr(front) = key; ) void insertrear(int key) ( if (isFull()) ( System.out.println(" Overflow "); return; ) if (front == -1) ( front = 0; rear = 0; ) else if (rear == size - 1) rear = 0; else rear = rear + 1; arr(rear) = key; ) void deletefront() ( if (isEmpty()) ( System.out.println("Queue Underflow"); return; ) // Deque has only one element if (front == rear) ( front = -1; rear = -1; ) else if (front == size - 1) front = 0; else front = front + 1; ) void deleterear() ( if (isEmpty()) ( System.out.println(" Underflow"); return; ) if (front == rear) ( front = -1; rear = -1; ) else if (rear == 0) rear = size - 1; else rear = rear - 1; ) int getFront() ( if (isEmpty()) ( System.out.println(" Underflow"); return -1; ) return arr(front); ) int getRear() ( if (isEmpty() || rear < 0) ( System.out.println(" Underflow"); return -1; ) return arr(rear); ) public static void main(String() args) ( Deque dq = new Deque(4); System.out.println("Insert element at rear end : 12 "); dq.insertrear(12); System.out.println("insert element at rear end : 14 "); dq.insertrear(14); System.out.println("get rear element : " + dq.getRear()); dq.deleterear(); System.out.println("After delete rear element new rear become : " + dq.getRear()); System.out.println("inserting element at front end"); dq.insertfront(13); System.out.println("get front element: " + dq.getFront()); dq.deletefront(); System.out.println("After delete front element new front become : " + +dq.getFront()); ) )
// Deque implementation in C #include #define MAX 10 void addFront(int *, int, int *, int *); void addRear(int *, int, int *, int *); int delFront(int *, int *, int *); int delRear(int *, int *, int *); void display(int *); int count(int *); int main() ( int arr(MAX); int front, rear, i, n; front = rear = -1; for (i = 0; i < MAX; i++) arr(i) = 0; addRear(arr, 5, &front, &rear); addFront(arr, 12, &front, &rear); addRear(arr, 11, &front, &rear); addFront(arr, 5, &front, &rear); addRear(arr, 6, &front, &rear); addFront(arr, 8, &front, &rear); printf("Elements in a deque: "); display(arr); i = delFront(arr, &front, &rear); printf("removed item: %d", i); printf("Elements in a deque after deletion: "); display(arr); addRear(arr, 16, &front, &rear); addRear(arr, 7, &front, &rear); printf("Elements in a deque after addition: "); display(arr); i = delRear(arr, &front, &rear); printf("removed item: %d", i); printf("Elements in a deque after deletion: "); display(arr); n = count(arr); printf("Total number of elements in deque: %d", n); ) void addFront(int *arr, int item, int *pfront, int *prear) ( int i, k, c; if (*pfront == 0 && *prear == MAX - 1) ( printf("Deque is full."); return; ) if (*pfront == -1) ( *pfront = *prear = 0; arr(*pfront) = item; return; ) if (*prear != MAX - 1) ( c = count(arr); k = *prear + 1; for (i = 1; i <= c; i++) ( arr(k) = arr(k - 1); k--; ) arr(k) = item; *pfront = k; (*prear)++; ) else ( (*pfront)--; arr(*pfront) = item; ) ) void addRear(int *arr, int item, int *pfront, int *prear) ( int i, k; if (*pfront == 0 && *prear == MAX - 1) ( printf("Deque is full."); return; ) if (*pfront == -1) ( *prear = *pfront = 0; arr(*prear) = item; return; ) if (*prear == MAX - 1) ( k = *pfront - 1; for (i = *pfront - 1; i < *prear; i++) ( k = i; if (k == MAX - 1) arr(k) = 0; else arr(k) = arr(i + 1); ) (*prear)--; (*pfront)--; ) (*prear)++; arr(*prear) = item; ) int delFront(int *arr, int *pfront, int *prear) ( int item; if (*pfront == -1) ( printf("Deque is empty."); return 0; ) item = arr(*pfront); arr(*pfront) = 0; if (*pfront == *prear) *pfront = *prear = -1; else (*pfront)++; return item; ) int delRear(int *arr, int *pfront, int *prear) ( int item; if (*pfront == -1) ( printf("Deque is empty."); return 0; ) item = arr(*prear); arr(*prear) = 0; (*prear)--; if (*prear == -1) *pfront = -1; return item; ) void display(int *arr) ( int i; printf(" front: "); for (i = 0; i < MAX; i++) printf(" %d", arr(i)); printf(" :rear"); ) int count(int *arr) ( int c = 0, i; for (i = 0; i < MAX; i++) ( if (arr(i) != 0) c++; ) return c; )
// Deque implementation in C++ #include using namespace std; #define MAX 10 class Deque ( int arr(MAX); int front; int rear; int size; public: Deque(int size) ( front = -1; rear = 0; this->size = size; ) void insertfront(int key); void insertrear(int key); void deletefront(); void deleterear(); bool isFull(); bool isEmpty(); int getFront(); int getRear(); ); bool Deque::isFull() ( return ((front == 0 && rear == size - 1) || front == rear + 1); ) bool Deque::isEmpty() ( return (front == -1); ) void Deque::insertfront(int key) ( if (isFull()) ( cout << "Overflow" << endl; return; ) if (front == -1) ( front = 0; rear = 0; ) else if (front == 0) front = size - 1; else front = front - 1; arr(front) = key; ) void Deque ::insertrear(int key) ( if (isFull()) ( cout << " Overflow " << endl; return; ) if (front == -1) ( front = 0; rear = 0; ) else if (rear == size - 1) rear = 0; else rear = rear + 1; arr(rear) = key; ) void Deque ::deletefront() ( if (isEmpty()) ( cout << "Queue Underflow" << endl; return; ) if (front == rear) ( front = -1; rear = -1; ) else if (front == size - 1) front = 0; else front = front + 1; ) void Deque::deleterear() ( if (isEmpty()) ( cout << " Underflow" << endl; return; ) if (front == rear) ( front = -1; rear = -1; ) else if (rear == 0) rear = size - 1; else rear = rear - 1; ) int Deque::getFront() ( if (isEmpty()) ( cout << " Underflow" << endl; return -1; ) return arr(front); ) int Deque::getRear() ( if (isEmpty() || rear < 0) ( cout << " Underflow" << endl; return -1; ) return arr(rear); ) int main() ( Deque dq(4); cout << "insert element at rear end "; dq.insertrear(5); dq.insertrear(11); cout << "rear element: " << dq.getRear() << endl; dq.deleterear(); cout << "after deletion of the rear element, the new rear element: " << dq.getRear() << endl; cout << "insert element at front end "; dq.insertfront(8); cout << "front element: " << dq.getFront() << endl; dq.deletefront(); cout << "after deletion of front element new front element: " << dq.getFront() << endl; )
Χρόνος πολυπλοκότητας
Η χρονική πολυπλοκότητα όλων των παραπάνω λειτουργιών είναι σταθερή, δηλαδή O(1)
.
Εφαρμογές της δομής δεδομένων Deque
- Αναίρεση λειτουργιών σε λογισμικό.
- Για να αποθηκεύσετε το ιστορικό σε προγράμματα περιήγησης.
- Για την εφαρμογή τόσο στοίβες όσο και ουρές.