MODUL PRAKTIKUM
STRUKTUR DATA
QUEUE (ANTRIAN)
Oleh :
Muhammad Riza Hilmi, ST.
rizahilmi@gmail.com
BAB III
QUEUE (ANTRIAN)
1.
PENGERTIAN
a. Queue
Queue (antrian) adalah salah satu list linier dari struktur data yang beroperasi dengan cara
First In First Out (
FIFO
) yaitu elemen pertama yang masuk merupakan elemen yang
pertama keluar. Untuk penyisipan (
INSERT
) hanya dapat dilakukan pada satu sisi yaitu sisi
belakang (
REAR
), sedangkan untuk penghapusan (
REMOVE
) pada sisi depan (
FRONT
) dari
list.
hapus elemen
1 2 ……..
ke – n
sisip elemen
front
rear
Akan terjadi ketidakefisienan bila penambahan elemen sudah pada posisi index N (Rear =
N) maka tidak dapat lagi dilakukan penambahan elemen, sedangkan dilokasi memori yang
lain (nilai di bawah N) masih terdapat memori array yang kosong. Untuk mengatasi hal
tersebut maka kita bayangkan bahwa memori dari queue tersebut berbentuk melingkar
dimana kedua ujungnya saling bertemu atau disebut juga dengan
Circular Queue.
b. Circular Queue
Front
Q(1) Q(2)
...
Q(f)
Q(f+1)
...
Q(r)
...
Q(m)
Q(m)
Q(1)
Q(2)
. . .
Q(f)
Q(f+1)
. . .
2.
DEKLARASI
Bentuk deklarasi queue terdiri dari masing-masing fungsi :
a. AWAL(Inisialisasi)
Dituliskan dalam bentuk fungsi :
b. INSERT(Sisip, Masuk, Simpan, Tulis)
R maju dulu satu langkah (R=R+1), Kemudian isi ditempat yang
ditunjuk oleh R, atau Q[R] = X.
c. DELETE(Hapus, Keluar, Ambil atau Dilayani, Baca)
Ambil dulu yang ditunjuk oleh F, simpan di X Kemudian F maju
satu langkah (F = F+1).
d. RESET(Kembali ke keadaan awal)
Kembali ke keadaan dimana F = 0, dan R = 0.
3.
OPERASI-OPERASI
Adapun operasi pada antrian diantaranya adalah :
a. Create
membuat antrian baru atau menginisialisasi/mendefinisikan antrian yang
kosong.
b. IsEmpty
mengecek apakah antrian dalam kedaan kosong atau tidak.
c. IsFull
mengecek apakah antrian sudah penuh atau belum.
d. Enqueue
m
enambah elemen baru pada antrian yang berisi info baru (IB) pada posisi
paling belakang (REAR).
Syarat awal : Queue tidak penuh (jika penuh akan terjadi overflow).
Syarat akhir : Queue bertambah satu elemen.
F = 0; R = 0;
void AWAL () {
F = 0; R = 0; }
void INSERT() {
R = R + 1; Q[R] = X; }
void DELETE() {
X= Q[F]; F = F + 1;
}
void RESET() {
F = 0; R = 0;
e. Dequeue
menghapus elemen dari antrian yang berada pada posisi paling depan
(FRONT) dan infonya disimpan dalam info dequeue (ID)
Syarat awal : Queue tidak kosong (jika kosong akan terjadi underflow).
Syarat akhir : Queue berkurang satu elemen.
f.
Clear
menghapus elemen-elemen Antrian.
g. Tampil
menampilkan nilai-nilai elemen Antrian.
4.
ILUSTRASI
a. QUEUE
CREATE (Q)
Front
: 0
Rear
: 0
1
2
3
4
5
6
7
...
N
INSERT (INSERT(INSERT(INSERT(A),B),C),D)
Front
: 1
Rear
: 4
1
2
3
4
5
6
7
...
N
REMOVE(Q)
Front
: 2
Rear
: 4
1
2
3
4
5
6
7
...
N
INSERT(INSERT(E),F)
Front
: 2
Rear
: 6
1
2
3
4
5
6
7
...
N
REMOVE(Q)
Front
: 3
Rear
: 6
1
2
3
4
5
6
7
...
N
Dapat dilihat bahwa setiap terjadi penghapusan elemen pada queue nilai (index) dari Front
bertambah satu (1) ; dapat ditulis FRONT := FRONT+1. Begitu pula bila terjadi penambahan
elemen pada queue nilai (index) Rear bertambah satu (1) ; dapat ditulis REAR := REAR + 1.
A
B
C
D
...
...
B
C
D
...
B
C
D
E
F
...
b. CIRCULAR QUEUE
Suatu queue akan menempati lokasi sebanyak 5 array memori, dengan urutan operasi
sebagai berikut :
1. Create(Q)
F = 0
R = 0
1
2
3
4
5
2. Insert A, B, C
F = 1
R = 3
3. Remove (Q)
F = 2
R = 3
4. Insert D dan E
F = 2
R = 5
5. Remove(Remove(Q))
F = 4
R = 5
6. Insert F
F = 4
R = 1
7. Remove(Q)
F = 5
R = 1
8. Insert G, H, K
F = 5
R = 4
9. Insert L
F = 5
(
OVERFLOW
)
R = 4
10. Remove(Remove(Q))
F = 2
R = 4
11. Insert L
F = 2
R = 5
12. Remove(Remove
F = 0
(Remove(Remove(Q))))
R = 0
13. Remove(Q)
F = 0
(
UNDERFLOW
)
R = 0
A B C
B C
B C D E
D E
F D E
F E
F G H K E
F G H K E
G H K
G H K L
5.
LATIHAN
Latihan 1. Program Implemantasi Queue Dalam Array (QueueArray.cpp)
#include <iostream> #include <stdio.h> #include <conio.h> #include <malloc.h> #define max 50 #define True 1 #define False 0
struct typequeue{int belakang; int elemen[max]; };
struct typequeue queue;
void buatqueue(); void cetakqueue(); void enqueue(int IB); void dequeue();
int queuekosong(); int queuepenuh();
int main() { buatqueue(); enqueue(12); enqueue(78); enqueue(5); enqueue(34); cetakqueue(); cout << "\n\n"; dequeue(); cetakqueue(); cout << "\n\n"; dequeue(); cetakqueue(); cout << "\n\n"; enqueue(89); cetakqueue(); getch(); }
void buatqueue() { queue.belakang=0; }
int queuekosong()
{ if(queue.belakang==0) return(True);
else
return(False); }
int queuepenuh()
{ if(queue.belakang==max) return(True);
else
void enqueue(int IB) { if(queuepenuh())
cout << "queue overflow\n"; else
{ queue.belakang++;
queue.elemen[queue.belakang]=IB; } }
void dequeue() { int ID, i;
if(queuekosong())
cout << "queue underflow\n"; else
{ ID=queue.elemen[1];
for (i=1; i<queue.belakang; i++) queue.elemen[i]=queue.elemen[i+1]; queue.belakang--; }
}
void cetakqueue() { int i=1;
while(i<=queue.belakang)
{ cout << " " << queue.elemen[i]; i++; }
}
Latihan 2. Program Implementasi Queue Melingkar (CircularQueue.cpp)
#include <iostream> #include <stdio.h> #include <conio.h> #include <malloc.h> #define max 5
#define True 1 #define False 0
typedef float typeinfo;
struct typequeue{int depan, belakang; typeinfo elemen[max]; };
struct typequeue queue;
void buatqueue(); void cetakqueue(); void enqueue(float IB); void dequeue();
int queuekosong(); int queuepenuh();
dequeue(); cetakqueue(); cout << "\n\n"; enqueue(89); enqueue(11); cetakqueue(); getch(); }
void buatqueue() { queue.depan=1; queue.belakang=1; }
int queuekosong()
{ if(queue.depan==queue.belakang) return(True);
else
return(False); }
int queuepenuh() { int next_belakang; if(queue.belakang==max) next_belakang=1; else
next_belakang=queue.belakang+1; if (queue.depan==next_belakang) return(True);
else
return(False); }
void enqueue(float IB) { if(queuepenuh())
cout << "queue overflow\n"; else
{ if(queue.belakang==max) queue.belakang=1;
else
queue.belakang++;
queue.elemen[queue.belakang]=IB; } }
void dequeue() { typeinfo ID; if(queuekosong())
cout << "queue underflow\n"; else
{ ID=queue.elemen[queue.depan+1]; if(queue.depan==max)
queue.depan=1; else
queue.depan++; } }
cout << "Queue kosong !"; else
{ if(queue.depan<queue.belakang) { i=queue.depan+1;
while(i<=queue.belakang)
{ cout << " " << queue.elemen[i]; i++; }
} else
{ for(i=queue.depan+1;i<=max;i++) cout << " " << queue.elemen[i]; for(i=1;i<=queue.belakang;i++) cout << " " << queue.elemen[i]; }
} }
6.
TUGAS
Modifikasi program di atas sehingga terdapat beberapa pilihan menu yaitu :
1. Mengisi antrian (dengan kondisi masih bisa diisi data/tidak full)
2. Menghapus antrian (dengan kondisi ada data/data tidak kosong)
3. Membaca antrian