struktur data modul 2 (queue)

36
LAPORAN HASIL PRAKTIKUM STRUKTUR DATA Nama : YOPI LALA NIM : DBC 113 016 Kelas : G Modul : II (QUEUE) JURUSAN TEKNIK INFORMATIKA

Upload: yopi-miri

Post on 19-Dec-2015

67 views

Category:

Documents


1 download

DESCRIPTION

Yp

TRANSCRIPT

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

BAB VI

LAMPIRAN

OUTPUT :