Stack (tumpukan) adalah struktur data yang cuma bisa ditambah dan diambil dari satu ujung, yaitu bagian paling atas. Aturannya disebut LIFO, Last In, First Out: yang terakhir masuk, pertama keluar. Persis tumpukan piring: piring baru ditaruh di atas, dan yang diambil juga piring paling atas.
🧪 Tebakan cepat: kamu menaruh
"A", lalu"B", lalu"C"ke stack, lalu mengambil tiga kali. Urutan yang keluar apa? Tebak dulu, jawabannya ada di bagian "Stack dari array biasa".
Stack dari array biasa
Akhir array dianggap bagian atas tumpukan. Mulai dari ["A", "B"]:
| Langkah | Kode | Hasilnya | Isi stack (bawah ke atas) |
|---|---|---|---|
| 1 | stack.push("C") |
C ditaruh di atas | A, B, C |
| 2 | stack.at(-1) |
"C", cuma dilihat |
A, B, C |
| 3 | stack.pop() |
"C" |
A, B |
| 4 | stack.pop() |
"B" |
A |
| 5 | stack.pop() |
"A" |
kosong |
const stack = ["A", "B"]; // bawah ke atas
stack.push("C"); // ["A", "B", "C"]
console.log(stack.at(-1)); // C (cuma dilihat)
console.log(stack.pop()); // C
console.log(stack.pop()); // B
console.log(stack.pop()); // A
console.log(stack.pop()); // undefined, sudah kosong
push("C")menaruh isi baru di atas, yaitu di akhir array.pop()mengambil isi paling atas: membuangnya dari stack, lalu mengembalikannya.at(-1)cuma melihat isi paling atas tanpa mengambilnya. Operasi ini disebut peek. Hasilnya sama denganstack[stack.length - 1].pop()di stack kosong mengembalikanundefined, bukan error.
Yang masuk terakhir keluar pertama, jadi urutannya terbalik: C, B, A. Itu jawaban tebakannya.
Push, pop, dan peek semuanya O(1): jumlah langkahnya tetap, setinggi apa pun tumpukannya, karena cuma ujung atas yang disentuh dan gak ada isi yang digeser.
Membungkusnya jadi class Stack
Supaya aturan LIFO terjaga, array-nya dibungkus di dalam class. Class adalah cetakan object: new Stack() bikin satu stack baru, constructor jalan sekali waktu itu, dan this.items adalah array milik stack tersebut.
class Stack {
constructor() {
this.items = [];
}
push(item) {
this.items.push(item);
}
pop() {
return this.items.pop(); // undefined kalau kosong
}
peek() {
return this.items[this.items.length - 1];
}
}
const s = new Stack();
s.push("A");
s.push("B");
console.log(s.peek()); // B
console.log(s.pop()); // B
console.log(s.pop()); // A
- Di dalam class, array-nya selalu dipanggil
this.items, bukanitemssaja. peek()membaca isi terakhir tanpa mengubah apa pun, jadipop()sesudahnya masih mendapat isi yang sama.- Dua method lain yang sering ada:
size()mengembalikan jumlah isi, yaituthis.items.length, danisEmpty()mengembalikantruekalauthis.items.length === 0.
Stack dipakai di banyak tempat: tombol undo (yang terakhir dikerjakan dibatalkan duluan), tombol Back di browser, mengecek kurung berpasangan seperti ({[]}), dan call stack, catatan JavaScript tentang function mana yang sedang jalan.
💡 Kenapa stack pas untuk cek kurung? Tiap kurung tutup harus cocok dengan kurung buka yang paling terakhir dibuka. Di
({[]}),]harus cocok dengan[dulu, baru}dengan{. Simpan tiap kurung buka denganpush, lalu tiap ketemu kurung tutup,popdan cek pasangannya. Itu LIFO.
⚠️ Jebakan yang sering ketemu
- Memakai
shift()sebagai pop.shift()mengambil dari depan, jadi yang keluar malah yang pertama masuk. Selain urutannya salah,shift()juga menggeser semua isi, jadi O(n). Push di akhir, ambil juga dari akhir denganpop(). - peek yang ikut mengambil. Kalau
peek()memanggilpop(), isinya berkurang diam-diam. peek cuma membaca. - Lupa
this. Menulisitems.push(item)di dalam class bikin error, karenaitemsgak ada. Tulisthis.items. - Stack overflow. Function yang memanggil dirinya sendiri tanpa berhenti memenuhi call stack, sampai muncul error
Maximum call stack size exceeded.
TL;DR: Stack itu LIFO: yang terakhir masuk, pertama keluar, kayak tumpukan piring. push menaruh di atas, pop() mengambil yang paling atas, dan peek (at(-1) atau items[items.length - 1]) cuma melihat tanpa mengambil. Ketiganya O(1), karena cuma ujung atas yang disentuh. Push A, B, C lalu pop tiga kali memberi C, B, A. Di class, simpan isinya di this.items: size() adalah this.items.length, isEmpty() adalah this.items.length === 0, dan pop() di stack kosong memberi undefined.