Menguasai std::stack di C++: Panduan Komprehensif dengan Contoh Praktis
Apa Itu std::stack?
std::stack adalah adapter kontainer yang mengimplementasikan prinsip LIFO (Last In, First Out). Ini memungkini penyisipan dan penghapusan elemen hanya dari satu ujung – puncak. Secara default, ia menggunakan std::deque sebagai kontainer dasar, tetapi kontainer urutan apa pun (misalnya, std::vector atau std::list) dapat disediakan.
Adapter kontainer tidak mengekspos iterator, jadi Anda tidak dapat menelusuri stack secara langsung. Sebaliknya, Anda berinteraksi dengannya melalui fungsi anggotanya.
Tujuan Pembelajaran
- Definisikan std::stack dan pahami perilaku LIFO-nya
- Pelajari sintaks untuk mendeklarasikan stack
- Jelajahi tipe anggota dan operasi utama
- Kerjakan push, pop, top, empty, size, emplace, dan swap
- Implementasikan stack di Standard Template Library (STL)
Sintaks
Sertakan header <stack> dan deklarasikan stack dengan templat berikut:
template<class T, class Container = std::deque<T>> class stack;
- T – Tipe elemen; tipe C++ yang valid, termasuk kelas yang ditentukan pengguna.
- Container – Kontainer dasar; default adalah
std::deque.
Tipe Anggota
value_type – Tipe elemen T. container_type – Tipe kontainer dasar. size_type – Tipe integral tak bertanda untuk ukuran kontainer.
Operasi Inti
push() – Tambahkan elemen ke puncak. pop() – Hapus elemen puncak. top() – Akses elemen puncak tanpa menghapusnya. empty() – Periksa apakah stack tidak memiliki elemen. size() – Kembalikan jumlah elemen. emplace() – Konstruksi dan sisipkan elemen langsung di puncak. swap() – Tukar isi dengan stack lain.
Gambaran Umum Implementasi
Di bawah ini adalah representasi visual dari operasi stack (puncak stack ditunjukkan oleh pointer).
push() dan pop()
Metode push() menambahkan elemen baru, meningkatkan ukuran dengan satu:
stack.push(value);
Sebaliknya, pop() menghapus elemen puncak dan mengurangi ukuran:
stack.pop();
Contoh 1: Manipulasi Stack Dasar
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st; st.push(10); st.push(20); st.push(30); st.push(40); st.pop(); // removes 40 st.pop(); // removes 30 while (!st.empty()) { cout << ' ' << st.top(); st.pop(); } return 0; }
Output: 20 10
empty(), size(), top()
Fungsi utilitas ini memberikan wawasan cepat tentang status stack.
Contoh 2: Memeriksa Status Stack
#include <iostream> #include <stack> using namespace std; void display(stack<int> s) { while (!s.empty()) { cout << '\t' << s.top(); s.pop(); } cout << '\n'; } int main() { stack<int> st; st.push(32); st.push(21); st.push(39); st.push(89); st.push(25); cout << "The stack st is: "; display(st); cout << "\n st.size() : " << st.size(); cout << "\n st.top() : " << st.top(); st.pop(); cout << "\n st after pop: "; display(st); return 0; }
Output: menampilkan isi stack, ukuran, elemen puncak, dan status setelah pop.
emplace() dan swap()
• emplace() membangun elemen secara langsung, menghindari salinan tambahan.
• swap() menukar isi dua stack secara efisien.
Contoh 3: Menggunakan emplace() dan swap()
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st1, st2; st1.emplace(12); st1.emplace(19); st2.emplace(20); st2.emplace(23); st1.swap(st2); cout << "st1 = "; while (!st1.empty()) { cout << st1.top() << " "; st1.pop(); } cout << endl << "st2 = "; while (!st2.empty()) { cout << st2.top() << " "; st2.pop(); } }
Output: menunjukkan isi stack sebelum dan setelah pertukaran.
Menggunakan std::stack di STL
Implementasikan stack dengan satu baris:
std::stack<T> st;
Contoh:
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st; st.push(12); st.push(19); st.push(20); cout << st.top(); // 20 cout << st.size(); // 3 return 0; }
Ringkasan
- std::stack mengimplementasikan LIFO dan hanya memungkinkan akses ke elemen puncak.
- Ini adalah adapter kontainer; kontainer dasar default adalah
std::deque, tetapi dapat disesuaikan. - Fungsi inti:
push, pop, top, empty, size, emplace, swap. - Stack adalah alat ringan dan efisien untuk skenario yang memerlukan penyimpanan sementara elemen.