Stack (tumpukan) sebenarnya secara mudah dapat diartikan sebagai list (urutan) dimana penambahan dan pengambilan elemen hanya dilakukan pada satu sisi yang disebut top (puncak) dari stack.

Dengan melihat definisi tersebut maka jelas bahwa pada stack berlaku aturan LIFO (Last In First Out), yaitu elemen yang terakhir masuk akan pertama kali diambil atau dilayani. Salah satu analogi yang dapat dikemukakan di sini adalah tumpukan piring atau barang lain. Pada saat kita hendak menumpuk piring-piring tersebut tentulah yang kita lakukan adalah meletakkan piring pertama pada tempatnya, selsnjutnya meletakkan piring kedua di atas piring pertama dan demikian seterusnya. Pada saat kita hendak mengambil satu piring dari tumpukan tersebut, tentu yang diambil adalah piring teratas (yang terakhir kali ditaruh), bukan yang terbawah (yang pertama kali diletakkan).

Dua operasi dasar pada stack adalah PUSH (operasi pemasukan elemen ke dalam stack) dan POP (operasi pengambilan satu elemen dari dalam stack). Di bawah ini diberikan contoh pemakaian operasi PUSH dan POP dan isi stack untuk setiap selesai eksekusi satu operasi.
(Untuk mempermudah penulisan, di bawah ini isi stack tidak dituliskan secara bertumpuk, tetapi dengan kesepakatan:

 

  • elemen paling kanan adalah elemen yang ada pada TOS (Top Of the Stack)
  • stack yang dipakai bernama S
  • PUSH(S,B) berarti memasukkan elemen B ke dalam stack S
  • POP(B,S) berarti mengambil elemen dari stack S dan menaruhnya ke dalam variabel B

 

Operasi yang dilakukan Isi Stack Keterangan
Kondisi Awal kosong
PUSH(‘A’,S) A
PUSH(‘B’,S) AB
PUSH(‘C’,S) ABC
POP(Data,S) AB Variabel Data berisi ‘C’
PUSH(‘D’,S) ABD
POP(Data,S) AB Data berisi ‘D’
POP(Data,S) A Data berisi ‘B’

IMPLEMENTASI STACK DALAM BAHASA PASCAL

Implementasi dalam bahasa Pascal dapat dilakukan dengan memanfaatkan struktur data record dan array. Array dipergunakan untuk menyimpan elemen-elemen yang dimasukkan. Selain itu diperlukan pula suatu variabel untuk mencatat banyaknya elemen yang adadi dalam array yang sekaligus menunjukkan TOS. Pada implementasi di bawah ini:

  • konstanta maxelm menyatakan banyaknya elemen maksimum yang dapat ditampung oleh stack
  • typeelemen adalah tipe data yang akan disimpan di dalam stack (bisa integer, word, real, boolean, char , string atau lainya)
  • banyak adalah field yang menyatakan banyaknya elemen dalam stack saat itu, yang sekaligus menyatakan TOS

Deklarasi tipe untuk tumpukan (stack):
type tumpukan = record
banyak :0..maxelm;
elemen : array[1..maxelm] of typeelemen;
end;

Selain prosedur untuk POP dan PUSH, kita dapat pula menambahkan sejumlah fungsi untuk membantu penanganan kesalahan diantaranya adalah fungsi PENUHS (untuk mengecek apakah stack penuh) fungsi KOSONGS (untuk mengecek apakah stack kosong) dan fungsi SIZES (untuk mengetahui banyaknya elemen di dalam stack). Masing-masing sub program di atas dapat disajikan pseudocode-nya sebagai berikut:


Procedure Inisialisasi(var S : tumpukan);
begin
S. banyak¬ 0
end;


Function PENUHS(S : tumpukan): boolean;
begin
Jika S.banyak = maxelm maka 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

  1. S.banyak ¬ S.banyak +1
  2. S.elemen[S.banyak]¬data

end
else
Tampilkan pesan kesalahan “Stack Penuh”
end;


Procedure POP(var S : tumpukan; var data : typeelemen);
begin
If not KOSONGS(S) then
begin

  1. data¬S.elemen[S.banyak]
  2. S.banyak ¬ S.banyak – 1

end else
Tampilkan pesan kesalahan “Stack kosong”
End;

Implementasi Dalam Bahasa Pemrograman Pascal

Contoh 1 : Simpan dengan nama project Stack1

program stack;
uses crt;
const max = 100;
var
L : array [1..max] of char;
sisa, i, j, top : integer;
jawab : char;
kondisi : string;
procedure inisiasi;
begin
top :=0;
end;
procedure CEK;
begin
sisa := max – top;
if top = max then
kondisi := ‘penuh’
else
if ((top < max) and (top > 0)) then
kondisi := ‘belum penuh’
else
kondisi := ‘kosong’
end;
procedure PUSH;
begin
write(‘Masukan data : ‘);
readln(L[top+1]);
top := top + 1;
end;
procedure TAMPIL;
begin
writeln(‘Stack Yang Dihasilkan : ‘);
for i := top downto 1 do
begin
writeln(L[i]);
end;
end;
procedure POP;
begin
top := top – 1
end;
BEGIN
clrscr;
inisiasi;
jawab := ‘Y’;
while ((jawab = ‘Y’) or (jawab = ‘y’)) do
begin
writeln(‘PROGRAM STACK’);
writeln(‘1. PUSH’);
writeln(‘2. POP’);
writeln(‘3. Keluar’);
write(‘PILIH 1 ATAu 2 ? ‘);
readln(j);
case j of
1 : begin
CEK;
if kondisi = ‘penuh’ then
writeln(‘STACK PENUH, ANDA TIDAK BISA MENAMBAH TUMPUKAN’)
else
begin
if kondisi <> ‘penuh’ then
begin
CEK;
writeln (‘Stack ‘, kondisi, ‘, Masih Bisa Menampung : ‘, sisa, ‘ data’);
write (‘Apakah Anda mau Menambah Data ? (Y/T) ‘);
readln (jawab);
while (((jawab = ‘Y’) or (jawab = ‘y’)) and (kondisi <> ‘penuh’)) do
begin
PUSH;
writeln;
writeln;
CEK;
writeln;
writeln;
TAMPIL;
writeln;
writeln;
writeln (‘Stack ‘, kondisi, ‘Masih Bisa Menampung : ‘, sisa, ‘ data’);
write (‘Apakah Anda mau Menambah Data ? (Y/T) ‘);
readln (jawab);
end;
end
else
writeln (‘STACK PENUH’);
end;
end;
2 : begin
write (‘Apakah Anda Yakin Mau Menghapus Data ? (Y/T) ‘);
readln (jawab);
while (((jawab = ‘Y’) or (jawab = ‘y’)) and (kondisi <> ‘kosong’)) do
begin
POP;
writeln;
writeln;
CEK;
writeln;
writeln;
TAMPIL;
writeln;
writeln;
writeln (‘Stack Masih Bisa Dihapus : ‘, top, ‘ data’);
write (‘Apakah Anda Mau Menghapus Data ? (Y/T) ‘);
readln (jawab);
end;
if kondisi = ‘kosong’ then
writeln (‘STACK KOSONG’)
end;  3 : begin
exit;
end; end;
write (‘Apakah Mau Kembali Ke Menu Utama ? (Y/T) ‘);
readln (jawab);
end;
END.

Contoh 2 : Simpan dengan nama project Stack2

Program Stack2; uses wincrt;  const max=10;type stack=record
judul:array[1..max] of string;
harga:array[1..max] of longint;
atas:0..max;
end;
type jualbuku=record
juduljual:string;
hargajual:word;
end;
larik_jual=array[1..20] of jualbuku;
var buku,sp:stack;
jual:larik_jual;
judulmasuk,judulkeluar:string;
hargamasuk,hargakeluar:longint;
pil:1..8;
lagi,ketemu:boolean;
terjual,i,n,cacah:byte;hasil:real;
function kosong(s:stack):boolean;
begin
if s.atas=0 then kosong:=true else kosong:=false;
end;
function penuh(s:stack):boolean;
begin
if s.atas=max then penuh:=true else penuh:=false;
end;
procedure push(var s:stack;j:string;h:longint);
begin
if penuh(s) then writeln(‘Maaf stack sudah penuh’)
else
begin
inc(s.atas);
s.judul[s.atas]:=j;s.harga[s.atas]:=h;
end;
end;
procedure pop(var s:stack);
begin
if kosong(s) then writeln(‘Buku sudah habis’)
else
begin
judulkeluar:=s.judul[s.atas];hargakeluar:=s.harga[s.atas];
writeln(‘Terjual buku ‘,judulkeluar,’ seharga Rp ‘,hargakeluar);
inc(terjual);hasil:=hasil+hargakeluar;
dec(s.atas);
end;
end;
procedure cetak(var s:stack);
var i:byte;
begin
if kosong(s) then writeln(‘tumpukan kosong’) else
begin
writeln(‘DAFTAR BUKU DITUMPUKAN’);
writeln(‘——————————————‘);
for i:=s.atas downto 1 do
writeln(‘posisi ‘,i,’ dengan judul ‘,s.judul[i]:10);
writeln(‘——————————————‘);
end;end;
procedure cetakjual(var x:larik_jual);
var hasil:real;
begin
writeln(‘—————————————–‘);
writeln(‘No Judul Harga’);
writeln(‘—————————————–‘);
for i:=1 to n do
begin
writeln(i:2,’ ‘,x[i].juduljual:15,’ Rp ‘,x[i].hargajual:8);
hasil:=hasil+x[i].hargajual;
end;
writeln(‘—————————————–‘);
writeln(‘———————–total–Rp ‘,hasil:10:2);
end;
procedure caribuku(var s:stack);
var ketemu:boolean;
i,posisi:byte;
ulang:char;
cari:string;
begin
if kosong(s) then writeln(‘Buku sedang kosong’) else
begin
ulang:=’y’;
while ulang=’y’ do
begin
ketemu:=false;
write(‘Masukkan judul buku yang dicari ==> ‘);readln(cari);
for i:=1 to s.atas do
begin
if s.judul[i]=cari then
begin ketemu:=true;posisi:=i;end;
end;
if ketemu then writeln(‘Judul ‘,cari,’ ada di posisi ke ‘,posisi) else
writeln(‘Maaf judul ‘,cari,’ tidak ditemukan’);
writeln;
write(‘Mau cari judul lain? <y/t> ‘);readln(ulang);
end;
end;
end;  procedure ambilbuku(var s:stack);
var posisi,k:byte;
cari:string;
begin
ketemu:=false;sp.atas:=0;
write(‘Apa judul yang ingin diambil ‘);readln(cari);
for i:=s.atas downto 1 do
begin
if(s.judul[i]=cari) then
begin ketemu:=true;posisi:=i;end;
end;
if ketemu then
begin
for k:=s.atas downto posisi+1 do
begin
inc(sp.atas);
sp.judul[sp.atas]:=s.judul[k];
sp.harga[sp.atas]:=s.harga[k];
end;
s.atas:=posisi;
judulkeluar:=s.judul[s.atas];
hargakeluar:=s.harga[s.atas];
dec(s.atas);
for k:=sp.atas downto 1 do
begin
inc(s.atas);
s.judul[s.atas]:=sp.judul[k];
s.harga[s.atas]:=sp.harga[k];
end;
end
else writeln(‘Buku tidak ditemukan’);
end;   {program utama}
begin
lagi:=true;
while lagi do
begin
writeln(‘1. Menambah buku ke tumpukan’);
writeln(‘2. Mengambil buku dari tumpukan dan layani penjualan’);
writeln(‘3. Mencari buku’);
writeln(‘4. Mencetak daftar buku di tumpukan’);
writeln(‘5. Cek buku terjual’);
writeln(‘6. Mengambil buku tertentu’);
writeln(‘7. Mencetak buku terjual’);
writeln(‘8. Tutup toko dan cetak hasil penjualan’);
writeln;write(‘pilihan anda <1-6> ==> ‘);readln(pil);
case pil of
1:begin
write(‘Judul buku baru ==> ‘);readln(judulmasuk);
write(‘Harganya ==> ‘);readln(hargamasuk);
push(buku,judulmasuk,hargamasuk);
end;
2:begin
if not kosong(buku) then
begin
pop(buku);
inc(cacah);
hasil:=hasil+hargakeluar;
inc(n);
jual[n].juduljual:=judulkeluar;
jual[n].hargajual:=hargakeluar;
end
else writeln(‘Buku dalam tumpukan habis’);
end;
3:caribuku(buku);
4:cetak(buku);
5:begin
inc(terjual);
writeln(‘Sudah terjual sebanyak ‘,terjual,’ buku’);
writeln(‘Pendapatan sekarang Rp ‘,hasil:8:2);
writeln(‘Sisa buku ditumpukan ‘,buku.atas,’ buku’);
end;
6:begin
if not kosong(buku) then ambilbuku(buku) else writeln(‘Buku habis’);
if ketemu and not kosong(buku) then
begin
writeln(‘Buku yang diambil adalah ‘,judulkeluar);
writeln(‘Harganya Rp ‘,hargakeluar);
inc(cacah);
hasil:=hasil+hargakeluar;
inc(n);
jual[n].juduljual:=judulkeluar;
jual[n].hargajual:=hargakeluar;
end;
end;
7:cetakjual(jual);
8:begin
inc(terjual);
writeln(‘total terjual sebanyak ‘,terjual,’ buku’);
writeln(‘pendapatan total Rp ‘,hasil:8:2);
writeln(‘Sisa buku di tumpukan ‘,buku.atas,’ buku’);
lagi:=false;
writeln;
writeln(‘Terimakasih’);
end;
end;
readln;
end;
end.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *