Anda di halaman 1dari 32

Struktur Data

Antrian / Queue
Antrian/Queue
Menyimpan item berdasarkan
suatu urutan
FIRST IN FIRST OUT = FIFO

Contoh aplikasi:
◦ Antrian di kasir
◦ Antrian pengalihan pelayanan
telpon pada call center

front rear Q[0] Q[1] Q[2] Q[3] Comments


-1 -1 queue is empty
-1 0 J1 Job 1 is added
-1 1 J1 J2 Job 2 is added
-1 2 J1 J2 J3 Job 3 is added
0 2 J2 J3 Job 1 is deleted
1 2 J3 Job 2 is deleted
KI091305 Algoritma dan Struktur Data 2
Urutan item pada queue
3
◦ Item yang bisa dikeluarkan berada di depan
◦ Penambahan item dilakukan dari belakang

Operasi pada queue


◦ Construct a queue
◦ Check if empty
◦ Enqueue (add element to back)
◦ Front (retrieve value of element from front)
◦ Dequeue (remove element from front)

KI091305 Algoritma dan Struktur Data


Queue dengan Array
Implementasi
ENQUEUE dan DEQUEUE
(CARA GAMPANG)
◦ Jika ENQUEUE, front index tetap dan rear index bertambah.
◦ Jika DEQUEUE, item pertama dibuang.
Lalu pindah semua item lainnya ke depan. (Inefficient!!!)

rear rear rear rear rear = -1

3 3 6 9 6 9 9

front front front front front


Enqueue(3) Enqueue(9) Dequeue() Dequeue() Dequeue()

KI091305 Algoritma dan Struktur Data 4


Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

ujung depan ujung belakang


Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

ujung depan ujung belakang


Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer
REAR
• Saat data dihapus dari queue, naikkan posisi pointer FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

ujung depan ujung belakang


Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

ujung depan ujung belakang


Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

ujung depan ujung belakang


Queue adalah pada
bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

front rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer
FRONT

frontrear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Tempatkan data pada sebuah array, dan setlah pointer agar
menunjuk ke posisi FRONT dan REAR
• Saat data ditambahkan ke queue, naikkan posisi pointer REAR
• Saat data dihapus dari queue, naikkan posisi pointer FRONT
• Saat front==rear, berarti queue kosong

front==rear

Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …

Queue adalah pada


bagian yang berwarna hijau
Masalah yang timbul pada Cara 1
 Front dari rear selalu bertambah secara motononik,
sehingga memerlukan array dengan ukuran tak terhingga
front rear

array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 …


Pointer selalu bergerak ke kanan,
tak pernah kembali

Menyambungkan FRONT dan REAR dari array itu sehingga


membentuk cincin (RING BUFFER)
Cara 1I
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke queue:
nilai rear dinaikkan satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear

front
rear

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke
queue: nilai rear dinaikkan
satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear
front
rear

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke
queue: nilai rear dinaikkan
satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear
rear front

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke
queue: nilai rear dinaikkan
satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
rear front==rear
front

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke queue:
nilai rear dinaikkan satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear
rear
front

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke queue:
nilai rear dinaikkan satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear
rear
front

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke queue:
nilai rear dinaikkan satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear
rear

front

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke queue:
nilai rear dinaikkan satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear
rear

front

Queue adalah pada


bagian yang berwarna hijau
Cara 1
• Array dibuat seperti cincin,
n-1 0 dimana elemen terakhir
n-2 1
disambungkan dengan elemen
pertama
• Menambahkan data ke queue:
nilai rear dinaikkan satu
• Menghapus data dari queue:
nilai front dinaikkan satu
• Queue kosong pada saat
front==rear
rear==front

Queue adalah pada


bagian yang berwarna hijau
Masalah pada Ring Buffer
• Pada saat rear==front , ada dua interpretasi yang muncul,
“queue kosong” ataukah “queue full” status = 0
If (menu == 1)
n-1 0 n-1 0
n-2 1 n-2 1 If (status = 0)
status = 1
scanf(”%d”,&bil[rear
%max]);
Else if (menu==2)
empty full If (status = 1)
front
rear status = 0
0
5
Bil[front] = -1 1
rear==front rear==front empty
Front ++; 4
If (rear==front)
Printf(“Kosong”) 2
Queue adalah pada
Else if(bil[rear] != -1) 3
bagian yang berwarna hijau
Printf(“Penuh”)
Queue / Antrian
 Elemen yang pertama kali masuk ke antrian akan
keluar pertama kalinya.
 DEQUEUE adalah mengeluarkan satu elemen dari
suatu Antrian
 Terdapat satu buah pintu masuk di suatu ujung dan
satu buah pintu keluar di ujung satunya
 Sehingga membutuhkan variabel Head dan Tail
 Deklarasi Queue :

#define MAX 8
typedef struct{ int data[MAX];
int head;
int tail;
} Queue;
Queue antrian;
Operasi dalam Queue
 Create ( )
◦ Untuk menciptakan dan menginisialisasi Queue
◦ Dengan cara membuat Head dan Tail = -1
void Create()
{
◦ antrian.head=antrian.tail=-1;
}

 IsEmpty ( )
◦ Untuk memeriksa apakah Antrian sudah penuh atau belum
◦ Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty
◦ Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala
antrian (elemen pertama dalam antrian) yang tidak akan berubah-ubah
◦ Pergerakan pada Antrian terjadi dengan penambahan elemen Antrian
kebelakang, yaitu menggunakan nilai Tail
int IsEmpty()
{ if(antrian.tail==-1)
return 1;
else
return 0;
}
Operasi dalam Queue
 IsFull
◦ Untuk mengecek apakah Antrian sudah penuh atau belum
◦ Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah batas
elemen array pada C) berarti sudah penuh

int IsFull()
{ if(antrian.tail==MAX-1) return 1;
else return 0;
}

 Enqueue (data) void Enqueue(int data)


{if(IsEmpty()==1)
◦ Untuk menambahkan elemen ke dalam {antrian.head=antrian.tail=0;
Antrian, penambahan elemen selalu antrian.data[antrian.tail]=data;
printf("%d masuk!",antrian.data[antrian.tail]);
ditambahkan di elemen paling belakang. } else
if(IsFull()==0)
◦ Penambahan elemen selalu menggerakan {antrian.tail++;
variabel Tail dengan cara increment antrian.data[antrian.tail]=data;
printf("%d masuk!",antrian.data[antrian.tail]);
counter Tail }
}
Operasi dalam Queue
 Dequeue()
◦ Digunakan untuk menghapus elemen terdepan/pertama dari
Antrian
◦ Dengan cara mengurangi counter Tail dan menggeser semua elemen
antrian kedepan.
◦ Penggeseran dilakukan dengan menggunakan looping

int Dequeue()
{
int i;
int e = antrian.data[antrian.head];
for(i=antrian.head;i<=antrian.tail-1;i++)
{ antrian.data[i] = antrian.data[i+1]; }
antrian.tail--;
return e;
}
Operasi dalam Queue
 Clear()
 Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan
Head = -1
 Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus
arraynya, namun hanya mengeset indeks pengaksesan-nya

void Clear()
{antrian.head=antrian.tail=-1;
printf("data clear");}

 Tampil
 Untuk menampilkan nilai-nilai
elemen Antrian void Tampil()
{ if(IsEmpty()==0)
 Menggunakan looping dari
{ for(int i=antrian.head;i<=antrian.tail;i++)
head s/d tail { printf("%d ",antrian.data[i]);
}
}else printf("data kosong!\n");
}

Anda mungkin juga menyukai