Download - Struktur data modul 2 (queue)
LAPORAN HASIL PRAKTIKUM
STRUKTUR DATA
Nama : YOPI LALA
NIM : DBC 113 016
Kelas : G
Modul : II (QUEUE)
JURUSAN TEKNIK INFORMATIKA
FAKULTAS TEKNIK
UNIVERSITAS PALANGKA RAYA
2014
MODUL II
QUEUE
A. Tujuan Praktikum
1. Mahasiswa mampu memahami konsep queue.
2. Mahasiswa mampu mengimplementasikan queue untuk memecahkan masalah
tertentu.
B. Landasan Teori
Queue (antrian) adalah kumpulan objek data yang tipenya sama, tersusun
sebagai sebuah barisan linier. Elemen pertama di sebut sebagi Front/head dan
elemen terakhir disebut rear/tail. Penambahan data di lakukan pada akhir elemen,
sedangkan penghapusan elemen dilakukan pada elemen pertama. Sifat queue
tersebut di kenal dengan istilah FIFO (First In First Out). Yaitu data yang
pertama masuk akan keluar terlebih dahulu dan data yang terakhir masuk akan
keluar terakhir. Berikut ini adalah gambaran struktur data queue.
Elemen yang pertama kali masuk kedalam queu disebut elemen
depan(front/head of queu), sedangkan elemen yang terakhir kali masuk ke queu
disebut elemen belakang(real/tail of queu). Aturan penambahan dan penghapusan
elemen pada queue, yaitu pada penambahan elemen selalu di lakukan melalui
salah satu ujung, menempati posisi di belakang elemen-elemen yang sudah masuk
sebelumnya atau menjadi elemen paling belakang. Sedangkan penghapusan
elemen dilakukan di ujung yang berbeda, yaitu pada posisi elemen yang masuk
paling awal atau elemen terdepan.
Operasi-operasi dasar dari sebuah queue adalah :
1. Enqueue : proses penambahanelemen di posisi belakang.
2. Dequeue : proses pengambilanelemen di posisi depan.
Selain operasi dasar di atas, ada pula operasi-operasi lain yang dapat
dilakukan terhadap sebuah queue yaitu :
1.CREATE (Q) Operator yang menunjukkan suatu antrean hampa Q.
Berarti : Noel (Q) = 0
Front (Q) & Rear (Q) = tidak terdefinisi
2.ISEMPTY (Q) Operator yang menunjukkan apakah antrean Q hampa.
Operand : tipe data antrean
Hasil : tipe data boolean
ISEMPTY (CREATE (Q)) = True
3.INSERT (E, Q) Operator yang menginsert elemen E ke dalam antrean Q.
E ditempatkan di bagian belakang antrean.
Hasil : antrean yang lebih besar.
REAR (INSERT (E, Q)) = E
ISEMPTY (INSERT (E, Q)) = False
4.REMOVE (Q)Operator yang menghapus elemen bagian depan dari
antrean Q.
Hasil : antrean yang lebih pendek.
Pada setiap operasi, Noel (Q) berkurang 1 dan elemen ke-2 menjadi elemen
terdepan.
Jika Noel (Q) = 0 maka Q = hampa
Remove (Q) = kondisi error (underflow condition)
Remove (Create (Q)) = kondisi error (underflow condition)
Jika ada elemen baru yang akan masuk pada gambar (a), maka ia akan
diletak kan disebelah kanan F (gambar (b)). Jika ada elemen yang akan dihapus,
maka A akan dihapus lebih dulu (gambar (c)).
Contoh deklarasi antrian :
Const max = 5
Varantrian : array [1..max] of char;
Belakang, depan : integer; x : char;
Dengan menggunakan array, maka overflow dapat terjadi jika antrian telah
penuh, sementara masih ingin menambah elemen kedalam antrian. Dengan
mengabaikan adany aoverflow, maka penambahan elemenbaru yang
dinyatakanolehvar x dapat diimplementasikan denganstatemen :
belakang := belakang + 1;
antrian [belakang] := x;
Operasi penghapusan bisadi implementasikan dengan ;
x := antrian [depan];
depan := depan + 1;
Pada gambar (a) posisi depan = 1 dan belakang = 0. Pada gambar (b)
keadaan setelah penambahan empat buah elemen dimana posisi depan = 1 dan
belakang = 4. Pada gambar(c) keada ansetelah penghapusan dua buahel emen
dimanaposisidepan = 3 danbelakang =4. Pada gambar (d) keadaan setelah
penambahan dua buah elemen diamana posisidepan =3 danbelakang = 5.
Jika akan ditambah elemen baru, maka nilai belakang harus ditambah satu
menjadi 6.Sedangkan larik antrian tersebut hanya terdiri dari 6 elemen sehingga
tidakbisaditambah lagi meskipun sebenarnya larik tersebut masih kosong di dua
tempat.Oleh karena itu dilakukan dengan metodae penggeseran dimana jika ada
elemen yang dihapus, maka semua elemen lain digeser sehingga antrian selalu
dimulai dari depan = 1.
x := antrian [1];
for i := 1 to belakang-1 do
begin
antrian [ i] := antrian [i +1];
end;
Pada gambar (a) posisi depan = 1 dan belakang = 0. Pada gambar (b)
keadaan setelah penambahan empat buah elemen di mana posisi depan = 1 dan
belakang = 4. Padagambar(c) keadaan setelah penghapusan dua buah elemen
dimana posisi depan = 1 dan belakang= 2. Pada gambar (d) keadaan setelah
penambahan dua buah elemen di mana posisi depan =1 dan belakang = 4.Cara
penggeseran elemen tidak efisien untuk larik berukuran besar.Oleh karena itu
dilakukan dengan larik yang menyimpan elemen antrian sebagai larik memutar
(circular).
b. Dengan Menggunakan Circular Array
Salah satu variasi array adalah array melingkar (circular array), artinya
array dapat diakses mulai dari sembarang indeks (indeksawal) kearah indeks
terakhir (maksimum array), lalu memutar ke indeks pertama hingga kembali ke
indeks awal. Circular array adalah array yang dibuatseakan-akan merupakan
sebuah lingkaran dengan titik awal dan titik akhir saling bersebelahan jika array
tersebut masih kosong.Jumlah data yang dapat ditampung oleh array ini adalah
besarnya ukuran array dikurangi 1.Misalnya besar array adalah 8, maka jumlah
data yang dapat ditampung adalah 7.
Dengan circular array, meskipun posisi terakhir telah terpakai, elemen
baru tetap dapat ditambahkan pada posisi pertama jika posisi pertama dalam
keadaan kosong.Jika nilai head dan tail mencapai maksimum, maka akan
dikembalikan keposisiawal. Queue dengan circular array dapat dibayangkan
sebagaiberikut :
Aturan-aturandalam queue yang menggunakan circular array adalah :
1. Proses penghapusan dilakukan dengan cara nilai depan (front) ditambah 1
: depan = depan + 1.
2. Proses penambahan elemen sama dengan linear array yaitu nilai belakang
ditambah 1 : belakang = belakang + 1.
3. Jika depan = maka s dan ada elemen yang akan dihapus, maka nilai depan
= 1.
4. Jika belakang = maks dan depan tidak 1 maka jika ada elemen yang akan
ditambahkan ,nilai belakang=1
5. Jika hanya tinggal 1 elemen di queue (depan = belakang), dan akan
dihapus maka depan di isi 0 dan belakang di isi dengan 0 (queue kosong).
Front dan Tail akan bergerak maju, jika ;
1. Untuk penambahan.
2. Tail sudah mencapai elemen terakhir array akan memakai elemen pertama
array yang telah dihapus.
3. Untuk pengahapusan.
4. Front telah mencapai elemen terakhir array, maka akan menuju elemen
pertama jika antrian masih berisi elemen.
Keunggulan representasi circular adalah seluruh kapasitas antrian bisa terpakai
seleruhnya.Berdasarkan ilustrasi sebelumnya dapat disusun prosedur untuk
menambah dan menghapus elemen antrian sebagai berikut ini :
Constmax_elemen = 5;
Type antri = array [1..max_elemen] of char;
Varantrian :antri;
depan, belakang : integer;
Nilai awal untuk depan dan belakang masing-masing 0.
Depan := 0; Belakang := 0;
Proses dequeue hanya bisa dilakukan jika queue dalam keadaan tidak kosong.Ada
beberapa kondisi yang harus diperhatikan ketika dequeue elemen queue yaitu :
Kondisi ketika posisi depan sama dengan posisi belakang (queue hanya
memiliki 1elemen) maka nilai depan dan belakang di isi dengan 0 (queue
kosong).
Jika posisi depan sama dengan posisi maks_queue maka posisi depan
berpindah ke 1.
Selain itu, posisi depan ditambah dengan 1 : depan = depan + 1
Const
NMAX = . . . . ;
NULL = 0;
Type
tipedata = . . . . ;
queue = record;
tabelemen : array [ 1 . . NMAX] of tipedata
front, rear : NULL . . . NMAX;
end;
Berdasarkan sifatnya, maka ada dua operasi terhadap queue, yaitu :
1. Penambahan operasi pada elemen akhir queue, disebut Enqueue.
2. Penghapusan data pada elemen pertama queue, disebut Dequeue.
Proses untuk membuat queue dalam keadaan kosong dapat di definisikan sebagai
berikut :
Procedure inisialisasi (var Q : queue);
Begin
Q. front := NULL;
Q. rear := NULL;
End;
Proses untuk mengetahui status queue dalam keadaan kosong atau tidak dapat di
definisikan sebagai berikut :
Function emptyQ (Q : queue ) : Boolean;
Begin
EmptyQ := ((Q. front=Null) and (Q. rear=Null));
End;
Pada saat penambahan data apabila ingin mengetahui apakah queue sudah
penuh atau belum, maka perlu diperhitungkan jumlah elemen data pada queue.
Sebuah queue penuh jika Q.rear = NMAX. Namun demikian tidak selamanya
kondisi Q.rear = Max menunjukan bahwa queue telah penuh . Kondisi Q.rear
=NMAX akan menunjukan queue telah penuh bisa selama proses pengoperasian
queue belum pernah ada data yang keluar (Dequeue).
Bila telah pernah terjadi operasi Dequeue maka akan terjadi pergeseran
penanda front sebanyak data yang telah keluar . Hal ini terjadi karena operasi
Dequeue dengan array hanya memindahkan index penanda front ke index yan di
atasnya. Dalam hal ini penghapusan elemen di depan mengakibatkan array pada
index menjadi kosong dan tidak terpakai. Jika hal ini terjadi maka perlu di
lakukan setup ulang index front (consolidate) dengan memindahkan semua data
kebagian awal dari tabel.
Procedure consolidate (var Q : queue);
{IS : Q.rear = NMAX dan Q.front <>1}
{FS : Q.front = 1 dan Q.rear = banyaknya data }
Var
I, j : integer ;
Begin
j:=1;
for i:= Q.front to Q.reae do
begin
Q.tabelemen [j] := Q.tabelemen [i];
j := j+1;
end;
Q.front := 1;
Q.rear :=j;
End;
Procedure Enqueue (var Q : queue; data : tipedata);
Begin
If emptyQ(Q) then
Q.front := 1;
If Q.rear <> NMAX then
Begin
Q.rear := Q.rear+1;
Q.tabelemen [Q.rear] :=data;
End;
Else
If Q.front <> 1 then
Begin
Consolidate (Q);
Q.rear := Q.rear+1;
Q.tabelemen[Q.rear] := data;
End;
End;
Procedure Dequeue (Var Q : queue; var data : tipedata);
Begin
Data := Q.tabelemen [Q.front];
Q.front := Q.front+1;
If (Q.front > Q.rear) then
Begin
Q.front := NULL;
Q.rear := NULL;
End;
Else
data := . . . . ;
End;
BAB II
LANGKAH KERJA
1. Sebuah plaza mempunyai ruang parkir yang hanya bisa diisi sampai 5
mobil saja pada satu jalur. Mobil yang datang lewat salah satu jalur (sebut
saja jalur A), sedangkan mobil yang akan keluar lewat jalur lainya (sebut
saja B). Jika ada sebuah mobil yang akan keluar dan kebetulan berada di
tengah, maka mobil- mobil lain yang berada di depannya harus di
pindahkan dulu, setelah mobil tersebut keluar maka mobil-mobil yang di
pindahkan tadi disusun kembali seperti semula. Jika mobil yang akan
masuk, tetapi jalur parker sudah penuh maka ada pesan “Parkir penuh!”.
Buatlah program dari kasus di atas.
Coding Program :
program Antrian;
uses crt;
const
nmax = 5;
null = 0;
type
tipedata = string;
queue = record
tabelemen:array[1..nmax] of tipedata;
front,rear:null..nmax;
end;
var a,b,c,i,jum : integer;
antri : queue;
mobil : tipedata;
procedure inisialisasi (var q:queue);
begin
q.front:=0;
q.rear:=null;
end;
function emptyQ (q:queue):boolean;
begin
emptyQ:=((q.front=null) and (q.rear=null));
end;
procedure consolidate(var q:queue);
var
i,j:integer;
begin
j:=1;
for i:=q.front to q.rear do
begin
q.tabelemen[j]:=q.tabelemen[1];
j:=j+1;
end;
q.front:=1;
q.rear:=j;
end;
procedure enqueue (var q:queue;data:tipedata);
begin
if emptyQ(q) then
q.front:=1;
if q.rear <> nmax then
begin
q.rear:=q.rear+1;
q.tabelemen[q.rear]:=data;
end
else
if q.front <> 1 then
begin
consolidate(q);
q.rear:=q.rear+1;
q.tabelemen[q.rear]:=data;
end;
end;
procedure dequeue(var q:queue;var data:tipedata);
begin
if not emptyQ(q) then
begin
data:=q.tabelemen[q.front];
q.front:=q.front+1;
end;
if (q.front>q.rear) then
begin
q.front:=null;
q.rear:=null;
end;
end;
procedure tampilAntri(q:queue);
begin
if not emptyQ(q) then
begin
writeln;
writeln('[=============================================]');
writeln('[ Isi Parkiran : ]');
writeln('[=============================================]');
for jum:=q.front to q.rear do
write(jum,' : ',q.tabelemen[jum],' => ');
writeln;
end
else
writeln('Parkiran Kosong');
writeln;
end;
procedure urut;
var p:char;
begin
for b:=antri.front to antri.rear do write(antri.tabelemen[b],' => ');
writeln;
writeln('Mobil yang keluar : ',antri.tabelemen[antri.front]);
write('Status (Y/T) : ');readln(p);
writeln('=========================');
if (p='Y') or (p='y') then
begin
dequeue(antri,mobil);
consolidate(antri);
antri.rear:=antri.rear-1;
a:=a-1;
if a=0 then writeln('Antrian Habis.....!!!')
else urut;
end
else
begin
consolidate(antri);
antri.tabelemen[antri.rear]:=antri.tabelemen[antri.front];
dequeue(antri,mobil);
consolidate(antri);
antri.rear:=antri.rear-1;
urut;
end;
end;
procedure MenuUtama;
var pilih: integer;
p: char;
begin
repeat
clrscr;
writeln('[=============================================]');
writeln('[ MENU UTAMA ]');
writeln('[=============================================]');
writeln('[ 1. Mobil Masuk ]');
writeln('[ 2. Keluarkan Mobil ]');
writeln('[ 3. Keluar Program ]');
writeln('[=============================================]');
write('Pilih Menu(1/2/3) : ');readln(pilih);
case pilih of
1: begin
tampilAntri(antri);
write('Parkirkan Mobil : '); readln(mobil);
if jum>4 then
writeln('Parkir Penuh')
else
begin
jum:=0;
antri.tabelemen[jum]:=mobil;
enqueue(antri,mobil);
jum:=jum+1;
end;
end;
2: begin
tampilAntri(antri);
gotoxy(1,14);
writeln('Mobil terdepan akan dikeluarkan!');
writeln;
dequeue(antri,mobil);
tampilAntri(antri);
gotoxy(1,16); clreol;
gotoxy(1,14); clreol;
end;
3: halt;
end;
writeln;writeln;
gotoxy(1,22);
write('Kembali ke Menu(Y/T) : ');readln(p);
until upcase (p) <> 'Y';
end;
begin
a:=5;
inisialisasi(antri);
MenuUtama;
readkey;
end.
BAB III
PEMBAHASAN
Const berfungsi untuk memeberi nilai tetap pada pascal, pada coding di
atas nilai const nmax di beri 5 dan nilai constanta null di beri 0.
Type berfungsi untuk mendeklarasikan type data pada pascal, pada
program di atas tipedata di beri string artinya tipedata tersebut hanya menampung
data yang berupa kata dan queue di beri tipe record ini berfungsi untuk merecord
semua data yang berhubungan dengan queue.
]]]]]
Procedur inisialisasi berfungsi untuk mendefinisikan bahwa keadaan
masih kosong pada program.
program Antrian;
uses crt;
const
nmax = 5;
null = 0;
type
tipedata = string;
queue = record
tabelemen:array[1..nmax] of tipedata;
front,rear:null..nmax;
end;
var a,b,c,i,jum : integer;
antri : queue;
mobil : tipedata;
procedure inisialisasi (var q:queue);
begin
q.front:=0;
q.rear:=null;
end;
function emptyQ (q:queue):boolean;
Function empty digunakan untuk mengetahui suatu keadaan kosong atau
tidaknya sebuah antrian pada program antrian (queue). Pada function di atas
sebuah antrian q.front dan q.rear kosong apabila bernilai null, di mana nilai null
sesuai dengan nilai constanta yang di berikan pada awal program.
Procedure Consolidate berfungsi untuk mengatur ulang bagian front
dengan memindahkan semua data kebagian awal dari table, procedure ini akan di
lakukan apabila terjadi operasi penghapusan yang mengakibatkan pergeseran front
sebanyak data yang di keluarkan.
procedure enqueue (var q:queue;data:tipedata);
begin
if emptyQ(q) then
q.front:=1;
if q.rear <> nmax then
begin
q.rear:=q.rear+1;
q.tabelemen[q.rear]:=data;
end else
procedure consolidate(var q:queue);
var
i,j:integer;
begin
j:=1;
for i:=q.front to q.rear do
begin
q.tabelemen[j]:=q.tabelemen[1];
j:=j+1;
end;
begin
emptyQ:=((q.front=null) and (q.rear=null));
end;
if q.front <> 1 then
begin
consolidate(q);
q.rear:=q.rear+1;
q.tabelemen[q.rear]:=data;
end;
end;
Procedure enqueue berfungsi untuk menambah atau menyisipkan
antrian, di mana antrian akan di tambahkan apa bila function empty terpenuhi,
yaitu q.front dan q.rear sama dengan null.
Procedure dequeue berfungsi untuk menghapus data yang pertama di masukan, hal ini terjadi karena prinsip antrian atau queue bersifat FIFO ( FIRST IN FIRST OUT) artinya data yang pertama masuk itu yang pertama kali di keluarkan, hal ini lah yang mebedakan antrian dengan tumpukan di mana tumpukan data yang terakhir masuk itu yang akan di keluarkan pertama kali.
procedure dequeue(var q:queue;var data:tipedata);
begin
if not emptyQ(q) then
begin
data:=q.tabelemen[q.front];
q.front:=q.front+1;
end;
if (q.front>q.rear) then
begin
q.front:=null;
q.rear:=null;
end;
end;
procedure tampilAntri(q:queue);
begin
if not emptyQ(q) then
begin
writeln;
writeln('[=============================================]');
writeln('[ Isi Parkiran : ]');
writeln('[=============================================]');
for jum:=q.front to q.rear do
write(jum,' : ',q.tabelemen[jum],' => ');
writeln;
end
else
writeln('Parkiran Kosong');
writeln;
end;
procedure urut;
var p:char;
begin
for b:=antri.front to antri.rear do write(antri.tabelemen[b],' => ');
writeln;
writeln('Mobil yang keluar : ',antri.tabelemen[antri.front]);
write('Status (Y/T) : ');readln(p);
writeln('=========================');
if (p='Y') or (p='y') then
begin
dequeue(antri,mobil);
consolidate(antri);
antri.rear:=antri.rear-1;
a:=a-1;
if a=0 then writeln('Antrian Habis.....!!!')
else urut;
Procedure tampilAntri dan procedure urut di atas di gunakan untuk menampilkan isi antrian atau parkiran pada layar monitor, sesuai dengan apa yang kita inputkan dan procedure di atas akan memberikan peringatan kepada kita apabila isi antrian atau parkiran masih kosong jika function empty tidak terpenuhi, dan akan memberikan kita peringatan bahwa parkiran masih kosong dan apbila parkiran atau antrian sudah penuh maka akan meberikan peringatan kepada kita bahwa parkiran sudah penuh.
Jika program di jalankan maka akan menghasilkan :
end
else
begin
consolidate(antri);
antri.tabelemen[antri.rear]:=antri.tabelemen[antri.front];
dequeue(antri,mobil);
consolidate(antri);
antri.rear:=antri.rear-1;
urut;
end;
end;
Pada program simulasi parkir di atas jika kita memilih menu 1, maka kita di suruh memasukan sebuah mobil di mana mobil yang kita masukan nanti tidak lebih dari 5 mobil, jika lebih dari 5 mobil maka program akan memberitahukan kepada kita bahwa parkiran sudah penuh dan apabila kita memilih menu 2 maka program akan mengeluarkan mobil yang paling depan atau yang paling pertama masuk akan di keluarkan terlebih dahulu.
BAB IV
KESIMPULAN
Dari praktikum yang telah di lakukan maka dapat di simpulkan bahwa :
Queue/antrian adalah ordered list dengan penyisipan di satu ujung, sedang
penghapusan di ujung lain.
Ujung penyisipan biasa disebut rear/tail, sedang ujung penghapusan
disebut front/head.
Queue bersifat FIFO (First In, First Out) artinya di mana data yang
duluan masuk itu yang terlebih dahulu keluar
BAB V
DAFTAR PUSTAKA
Dosen Teknik Informatika,2014
http://nbbajry.blog.com/2011/03/31/queue-antrian/
http://informasiterlengkap.blogspot.com/2012_06_01_archive.html