Stack (LIFO) — Struktur Data

Stack adalah struktur data yang mengikuti prinsip LIFO — Last In, First Out. Elemen terakhir yang masuk adalah yang pertama keluar. Analogi: Tumpukan piring —…

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

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

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 dengan push, lalu tiap ketemu kurung tutup, pop dan cek pasangannya. Itu LIFO.

⚠️ Jebakan yang sering ketemu

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.

Yang akan kamu pelajari