Stack
Memahami struktur data linier dengan prinsip LIFO (Last-In-First-Out) dan implementasinya menggunakan memori Array.
Motivasi
Bayangkan Anda sedang mencuci piring. Setiap kali selesai mencuci, Anda menaruhnya di atas tumpukan piring bersih. Ketika ingin membilas, piring mana yang akan diambil dulu? Tentu saja piring yang berada paling atas (yang terakhir Anda taruh), bukan piring yang berada di paling bawah.
Struktur data ini dikenal dengan Stack atau Tumpukan. Aturan mainnya sangat tegas: LIFO (Last-In-First-Out). Artinya, data yang terakhir masuk adalah yang pertama kali keluar.
Logika Stack digunakan hampir di mana saja: tombol Undo (Ctrl+Z), riwayat Back di browser, hingga cara komputer mengelola memori saat menjalankan fungsi.
Konsep Inti
Stack adalah daftar linier di mana penambahan dan penghapusan elemen hanya boleh dilakukan di satu ujung saja. Ujung ini disebut sebagai TOP (Puncak).
Ada dua operasi utama yang menjadi nyawa dari struktur data ini:
- Push: Menambahkan data ke atas tumpukan. Saat data masuk, posisi
TOPakan naik. - Pop: Mengambil data dari posisi paling atas. Saat data keluar, posisi
TOPakan turun.
Aturan Operasi
| Operasi | Keterangan | Syarat |
|---|---|---|
| Push | Masuk tumpukan | Tidak boleh penuh (!IsFull) |
| Pop | Keluar tumpukan | Tidak boleh kosong (!IsEmpty) |
Representasi dengan Array
Array sangat tepat untuk mewakili Stack karena kita bisa menggunakan indeksnya sebagai penunjuk posisi TOP. Dalam materi ini, kita menggunakan indeks mulai dari 1 agar logikanya lebih mudah dipahami:
- Kosong: Jika
TOPbernilai0. - Penuh: Jika
TOPsudah mencapai batas maksimal (MaxEl).
Visualisasi Memori
Kondisi Kosong (TOP = 0):
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
1 2 3 4 5 6 7 8 9 10
Kondisi Berisi 3 Elemen (TOP = 3):
[A] [B] [C] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
1 2 3 4 5 6 7 8 9 10
^
TOPOperasi Dasar
Mari kita bedah kode Push dan Pop menggunakan pointer.
Memasukkan Data (Push)
Sebelum memasukkan data, pastikan tumpukan belum penuh.
void Push(Stack *S, int x) {
if (!IsFull(S)) {
S->TOP++; // 1. Naikkan TOP
S->Data[S->TOP] = x; // 2. Isi datanya
} else {
cout << "Stack Penuh" << endl;
}
}
Awas Stack Overflow!
Jika Anda terus melakukan Push padahal tumpukan sudah penuh, program akan mencoba menulis ke memori di luar batas array. Ini disebut Stack Overflow dan bisa menyebabkan aplikasi macet.
Mengambil Data (Pop)
Kita tidak bisa mengambil data dari tumpukan yang kosong. Kita menggunakan pointer *x agar nilai yang diambil bisa kita gunakan kembali.
void Pop(Stack *S, int *x) {
if (!IsEmpty(S)) {
*x = S->Data[S->TOP]; // 1. Ambil nilainya
S->TOP--; // 2. Turunkan TOP
} else {
cout << "Stack Kosong" << endl;
}
}
Apakah Datanya Hilang?
Operasi Pop sebenarnya tidak menghapus nilai di dalam array secara fisik. Kita hanya menurunkan indeks TOP. Data lama akan tetap ada di sana sampai tertimpa oleh data baru saat Anda melakukan Push lagi.