Tumpukan (stack)
Memeriksa apakah kurung dalam {[()()]} berpasangan dengan benar butuh satu tumpukan dan 8 kali push dan pop, satu untuk setiap kurung.
Masuk terakhir, keluar pertama
Bayangkan setumpuk piring. Kamu menaruh piring bersih di atas, dan saat butuh satu, kamu mengambilnya dari atas. Piring yang terakhir ditambahkan menjadi yang pertama keluar. Tumpukan (stack) adalah struktur data dengan aturan persis seperti itu, yang disebut masuk terakhir, keluar pertama (LIFO). Ada dua operasi utama: push menaruh nilai di atas, dan pop mengambil nilai teratas lalu mengembalikannya. Banyak tumpukan juga menyediakan peek, yang melihat nilai teratas tanpa mengambilnya.
Dalam catatan 6.006 MIT, tumpukan adalah kasus khusus dari antarmuka barisan (sequence): insert last(x) dan delete last(). Itu sudah memberi tahu cara membuatnya. Taruh nilai-nilainya di array dinamis dan perlakukan ujung array sebagai bagian atas. Di unit sebelumnya ujung adalah bagian yang murah, jadi push dan pop masing-masing memakan 1 langkah (teramortisasi, karena sesekali ada penyalinan). Ukuran tumpukan tidak berpengaruh. Pop dari tumpukan berisi 3 nilai atau 3 juta nilai sama-sama satu langkah.
const stack = [];
stack.push(4);
stack.push(8);
stack.push(5);
console.log(stack.pop()); // 5, yang terakhir di-push
console.log(stack[stack.length - 1]); // peek: 8
console.log(stack.length); // 2Seret untuk memutar. Gulir atau cubit untuk memperbesar.
Memeriksa kurung
Kegunaan klasik tumpukan adalah memeriksa apakah kurung seimbang, sesuatu yang dilakukan setiap editor kode dan compiler. Baca teksnya dari kiri ke kanan. Setiap kurung buka, (, [, atau {, di-push. Setiap kurung tutup harus cocok dengan kurung buka di puncak tumpukan: kalau cocok, pop kurung buka itu; kalau tumpukan kosong atau puncaknya jenis lain, string itu tidak seimbang. Di akhir, tumpukan harus kosong; kalau tidak, ada kurung buka yang tidak pernah ditutup.
Coba string-string di laboratorium. {[()()]} butuh 4 push dan 4 pop, 8 langkah, dan berakhir dengan tumpukan kosong. ([)] gagal di karakter ketiga: ) datang saat [ ada di puncak. (() terbaca sampai akhir dengan satu ( tersisa. Mengapa tumpukan cocok untuk tugas ini? Kurung bersarang, dan kurung yang paling baru dibuka harus menjadi yang pertama ditutup. Itulah masuk terakhir, keluar pertama.
Di mana lagi tumpukan muncul
- Tumpukan pemanggilan. Saat fungsi a memanggil b dan b memanggil c, komputer melakukan push catatan untuk setiap pemanggilan. Saat c selesai, catatannya di-pop dan b melanjutkan dari tempat ia berhenti. Rekursi tak berujung memenuhi tumpukan ini, dan itulah galat "stack overflow".
- Urungkan (undo). Editor melakukan push setiap perubahan. Undo melakukan pop perubahan terbaru lalu membatalkannya.
- Tombol Kembali. Browser melakukan push setiap halaman yang kamu tinggalkan; Kembali melakukan pop halaman terakhir.
- Pencarian mendalam. Kursus algoritma memakai tumpukan untuk masuk sedalam mungkin di labirin sebelum mundur.
- Dalam urutan apa tumpukan mengembalikan nilai-nilainya?
- Masuk pertama, keluar pertama
- Masuk terakhir, keluar pertama
- Yang terkecil dulu
- Urutan acak
- Mulai dari kosong. Push 4, push 8, push 5, pop, push 2. Apa yang ada di puncak?
- 4
- 8
- 5
- 2
- Setelah operasi-operasi itu, ada berapa nilai di tumpukan?
- Push A, lalu B, lalu C, lalu pop sampai kosong. Susun nilai yang di-pop sesuai urutannya.
- Berapa total push dan pop untuk memeriksa {[()()]} dengan metode kurung?
- Memeriksa ([)] dari kiri, di mana gagalnya?
- Di ( yang pertama
- Di [
- Di )
- Di ] yang terakhir
- Apa yang salah dengan (() ?
- Kurung tutup datang saat tumpukan kosong
- Satu ( masih ada di tumpukan pada akhirnya
- Kurung siku tidak ada
- Tidak ada; string itu seimbang
- Pop dari tumpukan (disimpan dalam array dinamis) yang berisi 1000 nilai butuh berapa langkah?
- Fungsi main memanggil draw, dan draw memanggil line. Saat line berjalan, catatan mana yang ada di puncak tumpukan pemanggilan?
- main
- draw
- line
- tidak ada
- Pada tahun berapa Bauer dan Samelson mengajukan paten untuk metode tumpukan?
- 1946
- 1957
- 1962
- 1972
- Tumpukan bersifat masuk terakhir, keluar pertama: push di atas, pop dari atas.
- Jika dibangun di ujung array dinamis, push dan pop masing-masing 1 langkah.
- Pemeriksaan kurung melakukan push untuk kurung buka dan pop untuk setiap kurung tutup; {[()()]} butuh 8 langkah.
- Tumpukan pemanggilan, undo, dan tombol Kembali adalah tumpukan.
Sumber kursus ini (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 2 Data Structures (interface vs data structure, Sequence and Set interfaces, stack = insert_last/delete_last, queue = insert_last/delete_first, array, linked list, dynamic array, amortized Θ(1) append)
- 4 Hashing (chaining, pigeonhole collisions, chain length n/m)
- 6 Binary Trees Part 1 (height, traversal order, O(h) operations) and 7 Binary Trees Part 2: AVL (Adelson-Velsky and Landis, 1962) at ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes
- MDN Web Docs, Array.prototype.shift (shifts all values left by 1)
- Array.prototype.unshift, Map (insertion order, Map vs Object, spec requires sublinear average access) and Set (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)
- ECMAScript 2025 Language Specification (tc39.es/ecma262)
- 24.1 Map Objects and 24.2 Set Objects ("must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements")
- Array.prototype.shift steps (Repeat, while k < len: move element k to k - 1)
- D. E. Knuth, The Art of Computer Programming vol. 3 (2nd ed. 1998) section 6.4 History (H. P. Luhn, IBM internal memorandum January 1953, hashing with chaining; digit pairs added mod 10, 31415926 -> 4548) via gwern.net copy, and IEEE Spectrum, "Hans Peter Luhn and the Birth of the Hashing Algorithm" (2018)
- "A brief history of the stack", SIGCIS (sigcis.org/files/A brief history.pdf: Bauer and Samelson applied for the patent in 1957, US 3,047,228 granted July 31, 1962; IPL list processing by Newell, Simon and Shaw at RAND 1956) and Wikipedia, Information Processing Language (Newell, Shaw, Simon, RAND and Carnegie Institute of Technology, about 1956).
Diperiksa: 2026-10-18