Dalam tutorial ini, anda akan mengetahui apa itu antrian berganda (deque). Anda juga akan dapati contoh operasi yang berbeza pada deque di C, C ++, Java dan Python.
Deque atau Double Ended Queue adalah sejenis barisan di mana penyisipan dan penyingkiran elemen dapat dilakukan dari arah depan atau belakang. Oleh itu, ia tidak mengikut peraturan FIFO (First In First Out).

Jenis-jenis Deque
- Input Restricted Deque
Dalam deque ini, input dibatasi pada satu hujung tetapi membenarkan penghapusan di kedua hujungnya. - Output Terhad Deque
Dalam deque ini, output dibatasi pada satu hujung tetapi membenarkan penyisipan pada kedua ujungnya.
Operasi pada Deque
Di bawah ini adalah pelaksanaan larutan pekeliling deque. Dalam susunan bulat, jika susunan penuh, kita bermula dari awal.
Tetapi dalam pelaksanaan array linear, jika array penuh, tidak ada lagi elemen yang dapat disisipkan. Dalam setiap operasi di bawah ini, jika array penuh, "mesej limpahan" dilemparkan.
Sebelum melakukan operasi berikut, langkah-langkah ini diikuti.
- Ambil susunan (deque) berukuran n.
- Tetapkan dua penunjuk pada kedudukan pertama dan tetapkan
front = -1
danrear = 0
.

1. Masukkan di Bahagian Depan
Operasi ini menambah elemen di bahagian depan.
- Periksa kedudukan depan.
Periksa kedudukan depan
- Sekiranya
front < 1
, buat semulafront = n-1
(indeks terakhir).Beralih ke depan hingga ke hujung
- Lain, turunkan depan dengan 1.
- Tambahkan kunci 5 baru ke dalam
array(front)
.Masukkan elemen di Depan
2. Masukkan di Belakang
Operasi ini menambahkan elemen ke belakang.
- Periksa sama ada array penuh.
Periksa sama ada deque penuh
- Sekiranya hiasan penuh, mulakan semula
rear = 0
. - Lain, tingkatkan belakang sebanyak 1.
Tingkatkan belakang
- Tambahkan kunci 5 baru ke dalam
array(rear)
.Masukkan elemen di belakang
3. Padam dari Depan
Operasi menghapus elemen dari depan.
- Periksa sama ada deque itu kosong.
Periksa sama ada deque kosong
- Sekiranya deque kosong (iaitu
front = -1
), penghapusan tidak dapat dilakukan ( keadaan underflow ). - Sekiranya deque hanya mempunyai satu elemen (iaitu
front = rear
), tetapkanfront = -1
danrear = -1
. - Jika tidak, depan berada di hujung (iaitu
front = n - 1
), tetapkan ke hadapanfront = 0
. - Lain ,
front = front + 1
.Menambah bahagian depan
4. Padam dari Belakang
Operasi ini menghapus elemen dari belakang.
- Periksa sama ada deque itu kosong.
Periksa sama ada deque kosong
- Sekiranya deque kosong (iaitu
front = -1
), penghapusan tidak dapat dilakukan ( keadaan underflow ). - Sekiranya deque hanya mempunyai satu elemen (iaitu
front = rear
), tetapkanfront = -1
danrear = -1
, ikuti langkah-langkah di bawah. - Sekiranya belakang berada di bahagian depan (iaitu
rear = 0
), tetapkan ke depanrear = n - 1
. - Lain ,
rear = rear - 1
.Kurangkan bahagian belakang
5. Tandakan Kosong
Operasi ini memeriksa sama ada deque itu kosong. Sekiranya front = -1
, deque itu kosong.
6. Periksa Penuh
Operasi ini memeriksa sama ada deque itu penuh. Sekiranya front = 0
dan rear = n - 1
ATAU front = rear + 1
, hiasan itu penuh.
Pelaksanaan Deque di Python, Java, C, dan 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; )
Kerumitan Masa
Kerumitan masa bagi semua operasi di atas adalah berterusan iaitu O(1)
.
Aplikasi Struktur Data Deque
- Dalam mengurungkan operasi perisian.
- Untuk menyimpan sejarah dalam penyemak imbas.
- Untuk melaksanakan kedua-dua timbunan dan barisan.