konsep dari Stack
Stack
Dalam memecahkan suatu
masalah, terkadang kita membutuhkan algoritma yang hanya memperbolehkan
insertion dan deletion pada akhir data saja, contohnya adalah algoritma
backtracking (runut balik) dsb. Nah, untuk memecahkan masalah semacam itu, kita
dapat menerapkan konsep stack.
Apa itu stack ?
Stack
adalah sebuah abstract data type (ADT) yang berisi koleksi data item yang hanya
dapat diakses pada akhir bagian stack tersebut, biasa disebut top. Hal ini
berarti bahwa didalam sebuah stack, kita dapat memasukkan (insert) dan
menghapus (delete) item hanya dari posisi top tersebut. Item terakhir yang kita
masukkan kedalam sebuah stack adalah item yang paling pertama harus kita
keluarkan. Itulah mengapa stack disebut sebagai Last-In-First-Out (LIFO) data
structure. Kalimat sederhana yang dapat menjelaskan konsep tersebut adalah
kalimat “Masuk belakangan keluar duluan”.
Didalam kehidupan sehari-hari, terdapat beberapa contoh penerapan
algoritma dari data structure ini, seperti dalam membuat suatu tumpukan piring,
tumpukan buku, tumpukan koin, tusuk sate, atau bahkan cara memakai gelang.
Salah satu
contoh, dalam membuat suatu tumpukan piring kita pasti menempatkan piring
pertama berada pada posisi paling bawah, dan piring terakhir berada pada
posisi paling atas.
Nah, ketika kita hendak mencuci atau mengambil
piring tersebut, maka kita akan mengambil piring pada tumpukkan atas terlebih
dahulu dan seterusnya hingga mencapai piring paling bawah. Hal tersebut juga
serupa pada tumpukan buku, koin, tusuk sate dan cara memakai gelang. Saya rasa
ilustrasi tersebut cukup menjelaskan konsep LIFO dari stack.
Berikut ini merupakan karakteristik yang dimiliki oleh stack :
– Data hanya dapat di-insert pada posisi top stack
– Data hanya dapat di-delete pada posisi top stack
– Data tidak dapat di-delete dari tengah-tengah stack tanpa memindahkan
item yang ada pada atasnya terlebih dahulu
Terdapat 2 operasi basic dalam stack :
– PUSH
– POP
Ketika kita
memasukkan data kedalam sebuah stack, kita dapat menyebutnya PUSH. Sebaliknya,
jika kita mengeluarkan data dari sebuah stack, kita dapat menyebutnya POP.
Untuk lebih memperjelas PUSH dan POP, Simaklah gambar berikut ini.
Operasi yang sering diterapkan pada struktur data Stack (Tumpukan) adalah
Push dan Pop. Operasi – operasi yang dapat diterapkan adalah sebagai berikut :
1. Push : digunakan
untuk menembah item pada Stack pada Tumpukan paling atas.
2. Pop : digunakan untuk mengambil item pada Stack pada Tumpukan paling atas.
3. Clear : digunakan untuk mengosongkan Stack.
4. Create Stack : membuat Tumpukan baru S, dengan jumlah elemen kosong.
5. MakeNull : mengosongkan Tumpukan S, jika ada elemen maka semua elemen dihapus.
6. IsEmpty : fungsi yang digunakan untuk mengecek apakah Stack sudah kosong.
7. Isfull : fungsi yang digunakan untuk mengecek apakah Stack sudah penuh
2. Pop : digunakan untuk mengambil item pada Stack pada Tumpukan paling atas.
3. Clear : digunakan untuk mengosongkan Stack.
4. Create Stack : membuat Tumpukan baru S, dengan jumlah elemen kosong.
5. MakeNull : mengosongkan Tumpukan S, jika ada elemen maka semua elemen dihapus.
6. IsEmpty : fungsi yang digunakan untuk mengecek apakah Stack sudah kosong.
7. Isfull : fungsi yang digunakan untuk mengecek apakah Stack sudah penuh
Macam – macam Stack
1. Stack dengan Array
Sesuai dengan sifat
stack, pengambilan atau penghapusan elemen dalam stack harus dimulai dari
elemen teratas.
2. Double Stack dengan
Array
Metode ini adalah
teknik khusus yang dikembangkan untuk menghemat pemakaian memori dalam
pembuatan dua stack dengan array. Intinya adalah penggunaan hanya sebuah array
untuk menampung dua stack.
contoh konsep dari push dan pop
Fungsi push: digunakan untuk menambahkan data ke dalam stack. Penambahan
data tidak bisa dilakukan apabila stack sudah penuh. Urutan perintahnya adalah:
menambahkan nilai top dan menambahkan data pada posisi nilai top. Jika dalam
Linked List menggunakan method addLast.
Fungsi pop: digunakan untuk mengeluarkan data teratas stack dengan
syarat bahwa stack tidak kosong. Urutan perintahnya adalah : menghapus data
pada posisi nilai top dan menurunkan nilai top.
program tumpukan_kata;
uses wincrt;
const elemen = 255;
type S255 = string [elemen];
tumpukan = record
isi : s255;
atas : 0..elemen;
end;
var
T : tumpukan;
U : char;
kata : s255;
m,n : integer;
uses wincrt;
const elemen = 255;
type S255 = string [elemen];
tumpukan = record
isi : s255;
atas : 0..elemen;
end;
var
T : tumpukan;
U : char;
kata : s255;
m,n : integer;
ulang: string;
procedure awalan (var T : tumpukan);
begin
T.Atas := 0;
end;
procedure push (var T : tumpukan; Z: char);
begin
T.Atas := T.Atas+1;
T.Isi[T.Atas] := Z;
end;
function pop (var T : tumpukan): char;
begin
pop := T.Isi[T.Atas];
T.atas := T.atas-1;
end;
procedure awalan (var T : tumpukan);
begin
T.Atas := 0;
end;
procedure push (var T : tumpukan; Z: char);
begin
T.Atas := T.Atas+1;
T.Isi[T.Atas] := Z;
end;
function pop (var T : tumpukan): char;
begin
pop := T.Isi[T.Atas];
T.atas := T.atas-1;
end;
begin
clrscr;
repeat
writeln('Masukkan Kata yang anda inginkan :');
read(kata);
writeln;
for m:= 1 to length (kata) do
push (T, kata[m]);
write('Elemen yang di-push : ', kata);
writeln;
readln;
for m:= 1 to length (kata) do
push (t, kata[m]);
writeln;
writeln('Hasil akhir push dibaca dengan pop : ');
for n:= 1 to length (kata) do
clrscr;
repeat
writeln('Masukkan Kata yang anda inginkan :');
read(kata);
writeln;
for m:= 1 to length (kata) do
push (T, kata[m]);
write('Elemen yang di-push : ', kata);
writeln;
readln;
for m:= 1 to length (kata) do
push (t, kata[m]);
writeln;
writeln('Hasil akhir push dibaca dengan pop : ');
for n:= 1 to length (kata) do
begin
u:= pop (T);
write(u);
end;
writeln;
writeln;
writeln('==========================================');
writeln;
writeln('Coba lagi? Ketik [Y / T], Kemudian [ENTER]');readln (ulang);
writeln;
clrscr;
Until (ulang = 'T') OR (ulang = 't');
writeln;
readln;
end.
u:= pop (T);
write(u);
end;
writeln;
writeln;
writeln('==========================================');
writeln;
writeln('Coba lagi? Ketik [Y / T], Kemudian [ENTER]');readln (ulang);
writeln;
clrscr;
Until (ulang = 'T') OR (ulang = 't');
writeln;
readln;
end.
program dari Stack
program stack1;
uses wincrt;
const NMax =100;
type
typestack = array [0..NMax] of integer;
var
stack:typestack;
begin
stack[0]:=0;
end;
begin
stackpenuh:=(stack[0]=NMax);
end;
Pengertian ADT
ADT adalah tipe data yang dibuat oleh programmer
sendiri yang memiliki suatu nama tertentu.
- ADT dapat berupa tipe data dasar namun diberi nama
baru atau berupa kumpulan tipe data berbeda yang
diberi nama baru.
- Untuk pembuatan ADT digunakan keyword typedef
sendiri yang memiliki suatu nama tertentu.
- ADT dapat berupa tipe data dasar namun diberi nama
baru atau berupa kumpulan tipe data berbeda yang
diberi nama baru.
- Untuk pembuatan ADT digunakan keyword typedef
Abstract
Data Type (ADT) adalah definisi TYPE
dan sekumpulan PRIMITIF (operasi dasar) terhadap TYPE
tersebut. Definisi TYPE dari sebuah ADT dapat mengandung sebuah definisi ADT
lain.
Misalnya:
ADT Waktu terdiri dari ADT JAM dan ADT DATE
GARIS yang terdiri dari dua buah POINT
SEGI4 yang terdiri dari pasangan dua buah POINT (Top, Left) dan
(Bottom, Right)
TYPE
diterjemahkan menjadi type terdefinisi dalam bahasa yang bersangkutan, misalnya
menjadi struct dalam bahasa C. Primitif,
dalam konteks prosedural, diterjemahkan menjadi
fungsi atau prosedural.
ADT biasanya diimplementasi menjadi dua buah modul, yaitu:
1.Definisi/Spesifikasi Type dan Primitif
Spesifikasi type sesuai
dengan bahasa yang bersangkutan
Spsesifikasi dari
primitif sesuai dengan kaidah dalam konteks prosedural, yaitu:
Fungsi : nama, domain, range, dan prekondisi jika ada
Prosedur : Initial State, Final State, dan Proses yang dilakukan
2. Body/realisasi dari
primitif, berupa kode program dalam bahasa yang bersangkutan.
Realisasi ADT
dalam beberapa bahasa:
Dalam modul
ADT tidak terkandung definisi variabel. Modul ADT biasanya
dimanfaatkan oleh modul lain, yang akan mendeklarasikan
variabel bertype ADT tersebut dalam modulnya. Jadi
ADT bertindak sebagai Supplier (penyedia
type dan primitif), sedangkan modul pengguna
berperan sebagai Client (pengguna) dari ADT
tersebut. Biasanya ada sebuah pengguna yang
khusus yang disebut sebagai main program (program utama) yang memanfaatkan
langsung type tsb.
konsep Array dalam Stack
Sebuah array dapat kita manfaatkan untuk mengimplementasikan stack jika
jumlah elemen maksimum diketahui. Ketika kita hendak meng- implementasikan
stack menggunakan array, kita harus memastikan bahwa array yang dideklarasikan
cukup untuk menyimpan data atau elemen maksimum pada stack.
Untuk
menerapkan stack menggunakan array, tentunya kita harus mendeklarasikan array
terlebih dahulu. Misalkan :
int stack[10];
Pendeklarasian diatas berarti
kita membuat sebuah array dengan ukuran/size sebesar 10, dan hanya dapat
menampung maksimal 10 nilai integer.
Setelah mendeklarasikan
array, kita perlu mendeklarasikan variabel untuk menyimpan index terakhir (top
position).