STACK (TUMPUKAN) Salah satu konsep yang sangat berguna di dalam Ilmu Komputer adalah satu bentuk struktur data yang disebut tumpukan (stack). Dalam bab ini kita akan mencoba menggali mengapa tumpukan sangat berguna dan memainkan peranan penting dalam pemrograman dan bahasa pemrograman. Juga akan disajikan contoh-contoh program untuk lebih memahami pemakaian tumpukan. Pengertian Tumpukan Secara sederhana, tumpukan bisa diartikan sebagai suatu kumpulan data yang seolaholah ada data yang diletakkan di atas data yang lain. Satu hal yang perlu kita ingat adalah bahwa kita bisa menambah (menyisipkan) data, dan mengambil (menghapus) data lewat ujung yang sama, yang disebut sebagai ujung atas tumpukan (top of stack). Untuk menjelaskan pengertian di atas kita ambil contoh sebagai berikut. Misalnya kita mempunyai dua buah kotak yang kita tumpuk, sehingga kotak kita tumpukan di atas kotak yang lain. Jika kemudian tumpukan dua buah kotak itu kita tambah dengan kotak ketiga, keempat dan seterusnya, maka akan kita peroleh sebuah tumpukan kotak, yang terdiri dari N kotak. Secara sederhana, sebuah tumpukan bisa kita ilustrasikan seperti gambar berikut. Pusat Pengembangan Pendidikan – Universitas Gadjah Mada 1 Dari gambar ini kita bisa mengatakan bahwa kotak B ada di atas kotak A dan ada di bawah kotak C. Gambar tersebut menunjukkan bahwa dalam tumpukan kita hanya bisa menambah atau mengambil sebuah kotak lewat satu ujung, yaitu bagian atas. Dapat dilihat pula bahwa tumpukan merupakan kumpulan data yang sifatnya dinamis, artinya kita bisa menambah dan mengambil data darinya. Timbul pertanyaan, ujung yang manakah yang kita anggap sebagai ujung atas tumpukan tersebut. Untuk menjawab pertanyaan ini kita harus menentukan ujung yang mana yang kita gunakan untuk mengambil atau menyisipkan data yang baru. Dengan penggambaran tumpukan seperti gambar tadi, kita menganggap atau memilih bahwa kotak F adalah bagian atas dari tumpukan tersebut. Jika ada kotak lain yang akan disisipkan, maka ia akan diletakkan di atas kotak F, dan jika ada kotak yang akan diambil, maka kotak F lah ayng akan diambil pertama kali. Tumpukan merupakan suatu seratai (list) yang mempunyai sifat “masuk terakhir keluar pertama” (last in first out - LIFO). Penyajian Tumpukkan Sebelum kita melihat pada operasi dasar pada sebuah tumpukan, kita akan melihat terlebih dahulu bagaimana penyajian sebuah tumpukan dalam Bahasa Pemrograman Pascal. Ada beberapa cara untuk menyajikan sebuah tumpukan. Dalam Pascal kita mengenal tipe data tersetruktur yang disebut larik (array). Dengan demikian kita bisa menggunakan larik ini untuk menyajikan sebuah tumpukan. Tetapi bisa segera kita liaht bahwa penyajian tumpukan menggunakan larik adalah kurang tepat. Alasannya adalah bahwa banyaknya elemen dalam larik tidak dapat diubah (statis), sedangkan dalam tumpukan banyaknya elemen bisa sangat bervariasi (dinamis). Oleh karena itu dalam penggunaan tumpukan lebih baik menggunakan linked list (senarai berantai). Pusat Pengembangan Pendidikan – Universitas Gadjah Mada 2 Operasi pada tumpukan Ada dua operasi dasar yang bisa kita laksanakan pada sebuah tumpukan, yaitu operasi menyisipkan data, atau mempush data, dan operasi menghapus data atau mempop data. Karena ke dalam tumpukan kita bisa mempush data, maka tumpukan juga sering disebut dengan pushdown list. Operasi Push Operasi push adalah operasi untuk menambahkan sebuah elemen paling atas dari sebuah tumpukan. Pemeriksaan yang dilakukan untuk operasi push adalah melihat isi tumpukan pada saat itu, jika pointer Berikut dari data Stack tidak kosong / nil (terdapat lebih dari satu data) maka pointer Berikut pada data Baru diset ke alamat yang sama pada pointer Berikut pada data Stack. Kemudian pointer Berikut pada Stack diset ke alamat data Baru. Pusat Pengembangan Pendidikan – Universitas Gadjah Mada 3 Jika pointer Berikut pada Stack kosong / nill maka pointer Berikut pada Stack diset ke alamat data Baru. procedure PUSH (var Stack : Tumpukan; Data : char); var Baru : Tumpukan; begin new(Baru); with Baru^ do begin Info := Data; Berikut := nil; end; if Stack^.Berikut <> nil then begin Baru^.Berikut := Stack^.Berikut; Stack^.Berikut := Baru end else begin Stack^.Berikut := Baru end end; Operasi POP Operasi pop adalah operasi untuk menghapus elemen yang terletak pada posisi paling atas dari sebuah tumpukan. Pusat Pengembangan Pendidikan – Universitas Gadjah Mada 4 Di dalam prosedur POP terdapat dilakukan pemeriksaan terhadap ada tidaknya tumpukan, sebab tumpukan kosong pada senarai berantai akan bernilai nil dan nilai. Operasi yang dilakukan pada prosedur ini adalah mengambil data pada tumpukan teratas, kemudian tumpukan kedua dari atas pointernya diset nil sebab tumpukan level ini (kedua dari atas) akan menjadi level teratas, kemudian data tumpukan teratas dihapus (dispose). procedure POP (var Stack : Tumpukan; var Kosong : boolean; var Data : char); var Bantu : Tumpukan; begin Data := ' '; if Stack^.Berikut = nil then Kosong := true else begin Kosong := false; Bantu := Stack^.Berikut; Data := Bantu^.Info; Stack^.Berikut := Bantu^.Berikut; dispose(Bantu) end end; Pusat Pengembangan Pendidikan – Universitas Gadjah Mada 5 Contoh Pemakaian Tumpukan dengan Senarai Berantai Berikut ini adalah contoh penggunaan tumpukan untuk membalikan sebuah kata dengan senarai berantai. program BALIK_KALIMAT; uses crt; type Tumpukan = ^Elemen; Elemen = record Info : char; Berikut : Tumpukan end; var DataStack : Tumpukan; Kalimat : String; I : integer; StatusKosong : boolean; Huruf : char; procedure INISIALISASI_TUMPUKAN (var Stack : Tumpukan); begin new(Stack); Stack^.Berikut := nil end; procedure PUSH (var Stack : Tumpukan; Data : char); var Baru : Tumpukan; begin new(Baru); with Baru^ do begin Info := Data; Berikut := nil; end; if Stack^.Berikut <> nil then begin Baru^.Berikut := Stack^.Berikut; Stack^.Berikut := Baru end else begin Stack^.Berikut := Baru end end; procedure POP (var Stack : Tumpukan; var Kosong : boolean; var Data : char); var Bantu : Tumpukan; begin Data := ' '; if Stack^.Berikut = nil then Kosong := true else begin Pusat Pengembangan Pendidikan – Universitas Gadjah Mada 6 Kosong := false; Bantu := Stack^.Berikut; Data := Bantu^.Info; Stack^.Berikut := Bantu^.Berikut; dispose(Bantu) end end; begin clrscr; INISIALISASI_TUMPUKAN (DataStack); writeln('TUMPUKAN UNTUK MEMBALIKAN KALIMAT'); writeln('---------------------------------'); writeln(''); write('KALIMAT ASLI : '); readln(Kalimat); for I := 1 to length(Kalimat) do PUSH(DataStack, Kalimat[I]); write('SETELAH DIBALIK : '); while StatusKosong = false do begin POP(DataStack, StatusKosong, Huruf); write(Huruf); end; dispose(DataStack); readln; end. Pusat Pengembangan Pendidikan – Universitas Gadjah Mada 7