TUMPUKAN
& ANTRIAN (STACK &QUEUE)
|
STACK (TUMPUKAN)
Stack (tumpukan)
sebenarnyasecaramudahdapatdiartikansebagailist (urutan)
dimanapenambahandanpengambilanelemenhanyadilakukanpadasatusisi yang disebuttop
(puncak)dari stack.
Denganmelihatdefinisitersebutmakajelasbahwapada stack
berlakuaturan LIFO (Last In First Out), yaituelemen yang
terakhirmasukakanpertama kali diambilataudilayani. Salah satuanalogi yang
dapatdikemukakan di siniadalahtumpukanpiringataubarang lain. Padasaatkitahendakmenumpukpiring-piringtersebuttentulah
yang kitalakukanadalahmeletakkanpiringpertamapadatempatnya,
selsnjutnyameletakkanpiringkedua di ataspiringpertamadandemikianseterusnya.
Padasaatkitahendakmengambilsatupiringdaritumpukantersebut, tentu yang
diambiladalahpiringteratas (yang terakhir kali ditaruh), bukan yang terbawah
(yang pertama kali diletakkan).
Duaoperasidasarpada stack adalahPUSH (operasipemasukanelemenkedalam
stack) danPOP (operasipengambilansatuelemendaridalam stack). Di
bawahinidiberikancontohpemakaianoperasi PUSH dan POP danisi stack
untuksetiapselesaieksekusisatuoperasi.
(Untukmempermudahpenulisan, di bawahiniisi stack tidakdituliskansecarabertumpuk, tetapidengankesepakatan:
Implementasidalambahasa
Pascal dapatdilakukandenganmemanfaatkanstruktur data record dan array. Array
dipergunakanuntukmenyimpanelemen-elemen yang dimasukkan. Selainitudiperlukan
pula suatuvariabeluntukmencatatbanyaknyaelemen yang adadidalam array yang
sekaligusmenunjukkan TOS. Padaimplementasi di bawahini:
Deklarasitipeuntuktumpukan
(stack):
type tumpukan = record banyak :0..maxelm; elemen : array[1..maxelm] of typeelemen; end;
Selainproseduruntuk POP dan PUSH, kitadapat pula
menambahkansejumlahfungsiuntukmembantupenanganankesalahandiantaranyaadalahfungsiPENUHS
(untukmengecekapakah stack penuh) fungsiKOSONGS (untukmengecekapakah
stack kosong) danfungsiSIZES (untukmengetahuibanyaknyaelemen di dalam
stack). Masing-masing sub program di
atasdapatdisajikanpseudocode-nyasebagaiberikut:
Procedure
Inisialisasi(var S : tumpukan);
begin S. banyak¬ 0 end;
Function
PENUHS(S : tumpukan): boolean;
begin JikaS.banyak = maxelmmaka PENUHS ¬ true else PENUHS ¬false end;
Function
KOSONGS(S : tumpukan):boolean;
begin If S.banyak = 0 then KOSONGS ¬ true else KOSONGS¬false end;
Procedure
PUSH(data : tipeelemen; var S : tumpukan);
begin If not KOSONGS(S) then begin
end
else Tampilkanpesankesalahan "Stack Penuh" end;
Procedure
POP(var S : tumpukan; var data : typeelemen);
begin If not KOSONGS(S) then begin
end
else Tampilkanpesankesalahan "Stack kosong" End;
QUEUE (ANTRIAN)
Queue atauantriansebenarnyajugamerupakansuatu list. Salah
satusifat yang membedakan queue dengan stack adalahbahwapada queue
penambahanelemendilakukanpadasalahsatuujung (ujungdepan) danpengambilandilakukanpadaujung
yang lain (ujungbelakang) . Dengandemikian queue
menggunakanprinsipFIFO (First In First Out), yaituelemen yang
pertamamasukakanpertama kali pula dikeluarkan.
Implementasidalambahasa
Pascal dapatdilakukandenganmemanfaatkanstruktur data record dan array. Array
dipergunakanuntukmenyimpanelemen-elemen yang dimasukkan. Selainitudiperlukan
pula suatuvariabeluntukmencatatbanyaknyaelemen yang ada di dalam array.
Padaimplementasi di bawahini:
Deklarasitipeuntukantrian
(queue):
type antrian= record banyak :0..maxelm; elemen : array[1..maxelm] of typeelemen; end;
Selainproseduruntuk ADDQ dan DELQ, kitadapat pula
menambahkansejumlahfungsiuntukmembantupenanganankesalahandiantaranyaadalahfungsiPENUHQ
(untukmengecekapakahantrianpenuh) fungsiKOSONGQ
(untukmengecekapakahantriankosong) danfungsiSIZEQ
(untukmengetahuibanyaknyaelemen di dalam queue). Masing-masing sub program di
atasdapatdisajikanpseudocode-nyasebagaiberikut:
Procedure
Inisialisasi(var q : antrian);
begin Q. banyak ¬ 0 end;
Function
PENUHQ(q : antrian): boolean;
begin JikaQ.banyak = maxelmmaka PENUHQ ¬ true else PENUHQ¬false end;
Function
KOSONGQ(q : antrian):boolean;
begin If Q.banyak = 0 then KOSONGQ ¬ true else KOSONGQ ¬ false end;
Procedure
ADDQ(data : tipeelemen; var q : antrian);
begin If not PENUHQ(Q) then begin
end
else Tampilkanpesankesalahan "AntrianPenuh" end;
Procedure
DELQ(var q : antrian; var data : typeelemen);
begin If not KOSONGS(Q) then begin
end
else Tampilkanpesankesalahan "Antriankosong" End;
Denganmelihatimplementasi
di ataskitadapatmerasakanadanyaketidakefisienan,
yaitubahwauntukmengambilsatuelemendari queue kitaharusmenggesersisaelemen
yang sebenarnyatidakmenjadiperhatiankita. Untuk data yang
sedikitmungkininitidakterasa, tetapiuntuk data yang
banyakmakaketidakefisienaniniakantampakjelas.
Untukmengatasipermasalahan di
ataskitadapatmenggunakanimplementasiqueue berputar,
yaitudenganmembiarkanseltetapkosongbilaelemenpadaseltersebutbarusajadiambil.
Bagaimanakahimplementasi queue berputar? Perhatikanimplementasi di bawahini.
type antrian_putar= record
depan,belakang,banyak :0..maxelm; elemen : array[1..maxelm] of typeelemen; end;
Field depandanbelakangmasing-masingadalahuntukmencatatlokasielementerdepan
(yang akandiambilberikutnya) danlokasielemen paling belakang (elementerakhir
kali masuk)
Procedure
ADDQ(data : tipeelemen; var q : antrian_putar);
begin If not PENUHQ(Q) then begin
end
else Tampilkanpesankesalahan "AntrianPenuh" end;
Procedure
DELQ(var q : antrian_putar; var data : typeelemen);
begin If not KOSONGS(Q) then begin
end
else Tampilkanpesankesalahan "Antriankosong" End; |
Sumber : KhabibMustofa,
Dr. techn.
0 komentar:
Posting Komentar