Struktur Data: Stack
Stack dan Implementasinya
Struktur Data: Stack

Apa itu Stack?
Stack adalah struktur data yang menerapkan prinsip LIFO (Last In, First Out), dimana elemen yang terakhir dimasukkan akan menjadi elemen pertama yang dikeluarkan. Misalnya seperti tumpukan buku yang ada di meja belajar, buku yang berada di paling atas tumpukan lebih mudah diambil dibandingkan buku di bawahnya, sehingga kita akan cenderung mengambil buku teratas terlebih dahulu.
Karakteristik Stack
- LIFO (Last In, First Out) elemen terakhir Stack akan menjadi elemen pertama dan akan dikeluarkan terlebih dahulu.
- Hanya punya satu titik akses utama
Stack hanya bisa diakses melalui satu ujung yang disebut
TOP, sehingga semua operasi penambahan (Push) dan penghapusan (Pop) elemen hanya bisa dilakukan di bagian teratas Stack. - Bisa diimplementasikan menggunakan 2 cara, yaitu
- Array : rentan mengalami Stack Overflow karena ukurannya tetap.
- Linked List : memakan banyak memori karena ukurannya berubah-ubah dan membutuhkan penyimpanan untuk pointer-pointernya.
- *Rentan terhadap Stack Overflow dan Stack Underflow* - Stack Overflow yaitu kondisi stack penuh dan tidak bisa menampung elemen baru. - Stack Underflow yaitu kondisi yang terjadi ketika mencoba menghapus elemen dari stack kosong.
- Kompleksitas waktu Big’O O(1) seluruh operasi elemen dalam Stack memiliki kompleksitas waktu konstan, tidak bergantung pada seberapa banyak elemen di dalamnya.
Operasi Dasar Stack
- Push()
→ digunakan untuk menambahkan elemen di bagian teratas Stack. Fungsi
Push(item)akan menambahkan elemen baru dengan metode.append()ke bagian akhir Stack, yang disebut sebagaiTOP.
class Stack:
def __init__(self):
self.stack = []
def push(self, item):
self.stack.append(item)
s = Stack()
s.push()
print(s.stack())
- Pop()
→ digunakan untuk menghapus elemen teratas Stack. Fungsi ini akan menghapus elemen
TOPStack dengan metodepop(). Jika Stack dalam keadaan kosong, maka akan terjadi Stack Underflow, dan fungsi akan menampilkan pesan'Stack Kosong’untuk menangani Error karena Stack Underflow.
class Stack:
def __init__(self):
self.stack = []
def push(self, item):
self.stack.append(item)
def pop(self):
if len(self.stack) == 0:
return "Stack Kosong!"
return self.stack.pop()
s = Stack()
print(s.pop())
- Peek()
→ digunakan untuk melihat elemen teratas Stack tanpa menghapusnya. Fungsi
peek()akan memeriksa apakah Stack kosong atau tidak terlebih dahulu. Jika Stack kosong, fungsi akan menampilkan pesan'Stack Kosong’. Jika Stack berisi elemen, elemenTOPStack akan diambil menggunakan perintahreturn self.stack[-1]kemudian akan ditampilkan sebagai output.
class Stack:
def __init__(self):
self.stack = []
def push(self, item):
self.stack.append(item)
def peek(self):
if len(self.stack) == 0:
return "Stack Kosong!"
return self.stack[-1]
s = Stack()
print(s.peek())
- isEmpty()
→ sangat penting dilakukan sebelum kita melakukan operasi
pop()danpeek(). fungsi ini digunakan untuk mengecek apakah Stack dalam keadaan kosong atau tidak. Jika Stack kosong, fungsiis_empty()akan menampilkan nilaiTrue. Sementara itu, jika Stack memiliki setidaknya satu elemen, fungsiis_empty()akan menampilkan nilaiFalse.
class Stack:
def __init__(self):
self.stack = []
def push(self, item):
self.stack.append(item)
def is_empty(self):
return len(self.stack) == 0
s = Stack()
print(s.is_empty())
Metode Implementasi Stack
- List Python
: memanfaatkan fitur bawaan Python untuk melakukan metode bawaan seperti
.append()untuk menambah elemen (push()) dan.pop()untuk menghapus elemen (pop()). - collections.deque (double-ended queue)
: lebih efisien digunakan karena memungkinkan
push()danpop()di kedua ujungnya. - queue.LifoQueue : mengimplementasikan Stack secara Thread-Safe, sehingga lebih aman digunakan dalam sistem multi-threading. Selain itu, kita juga dapat menetapkan batas ukuran Stack untuk menghindari Stack Overflow. Namun, dengan metode ini, Stack menjadi tidak fleksibel untuk memanipulasi elemen secara langsung, tidak seperti list dan deque.
- Class and Object (Object-Oriented Programing) : Stack lebih fleksibel dengan dukungan fitur tambahan, seperti pembatas ukuran, validasi operasi, dan exception handling. Metode ini cocok digunakan dalam proyek dengan kode kompleks.
Latihan dan Penjelasan
Latihan 1 - Implementasi Stack dengan List Python
# Latihan 1
# Program Undo Perintah Kalkulator
# Kelas untuk menyimpan dan mengelola operasi perhitungan dalam Stack
class Kalkulator:
# Stack untuk menyimpan riwayat operasi
def __init__(self, angka_awal):
self.history_operasi = []
self.hasil = angka_awal
# Fungsi untuk menghitung dan menambahkan operasi ke dalam Stack
def operasi(self, operator, angka):
hasil_sebelumnya = self.hasil
if operator == "+":
self.hasil += angka
elif operator == "-":
self.hasil -= angka
elif operator == "*":
self.hasil *= angka
elif operator == "/":
if angka != 0:
self.hasil /= angka
else:
print("⚠️ Error: Tidak bisa membagi angka dengan nol!")
return
self.history_operasi.append((operator, angka))
print(f"🚥 Operasi: {hasil_sebelumnya} {operator} {angka} = {self.hasil}\n")
# Fungsi untuk membatalkan (undo) operasi penghitungan pada kalkulator
def undo(self):
if self.history_operasi:
operator, angka = self.history_operasi.pop()
if operator == "+":
self.hasil -= angka
elif operator == "-":
self.hasil += angka
elif operator == "*":
self.hasil /= angka
elif operator == "/":
self.hasil *= angka
print(f"⬅️ Undo: Membatalkan operasi '{operator} {angka}',\n🧩 Hasil kembali menjadi: {self.hasil}\n")
else:
print("🚫 Tidak ada yang bisa di-Undo\n")
# ========= Program Utama (Main) ========= #
# Meminta input NPM dari user
NPM = input("Masukkan NPM-mu : ")
# Mengambil 2 digit terakhir NPM sebagai angka awal
angka_awal = int(NPM[-2:])
print(f"🧩 Angka awal : {angka_awal}\n")
# Membuat objek kalkulator
hitung = Kalkulator(angka_awal)
# Menampilkan opsi yang tersedia untuk user
while True:
perintah = input("Masukkan operasi (+)(-)(*)(/) \n['Undo' untuk membatalkan]['x' untuk keluar] : ").lower()
# Memproses input user
# Jika user mimilih 'undo' atau 'x'
if perintah == 'undo':
hitung.undo()
continue
elif perintah == 'x':
print("👋🏻 Anda Keluar dari program. Terima kasih")
break
# Validasi operator
if perintah not in ['+', '-', '*', '/']:
print("❌ Operator tidak valid!\n")
continue
# Validasi input angka
while True:
try:
angka = float(input("Masukkan angka : "))
break
except ValueError:
print("❌ Input tidak valid! Masukkan angka dengan benar.")
# Mulai menghitung
hitung.operasi(perintah, angka)
1. Definisi class dan Stack
class Kalkulator:
def __init__(self, angka_awal):
self.history_operasi = []
self.hasil = angka_awal
Secara keseluruhan, class Kalkulator akan menyimpan dan mengelola operasi hitung dalam Stack dalam bentuk history atau riwayat. Ada dua atribut yang didefinisikan dalam kelas ini, antara lain:
history_operasididefinisikan sebagai Stack kosong. Stack ini akan menyimpan history seluruh operasi hitung yang telah dilakukan.hasildidefinisikan dengan nilai awalangka_awalyang diinputkan user. Atribut ini digunakan untuk menyimpan hasil operasi hitung matematika yang telah dilakukan.
2. Definisi Fungsi operasi
def operasi(self, operator, angka):
hasil_sebelumnya = self.hasil
if operator == "+":
self.hasil += angka
elif operator == "-":
self.hasil -= angka
elif operator == "*":
self.hasil *= angka
elif operator == "/":
if angka != 0:
self.hasil /= angka
else:
print("⚠️ Error: Tidak bisa membagi angka dengan nol!")
return
self.history_operasi.append((operator, angka))
print(f"🚥 Operasi: {hasil_sebelumnya} {operator} {angka} = {self.hasil}\n")
Fungsi operasi digunakan untuk melakukan operasi hitung matematika sederhana, seperti penjumlahan, pengurangan, perkalian, dan pembagian.
hasil_sebelumnyaakan menyimpan nilai hasil operasi hitung saat ini yang diambil dari atributhasil. Hasil operasi hitung saat ini tuh maksudnya, hasil dari operasi hitung yang baru saja dilakukan, atau ibaratnya hasil terakhir sebelum kita melakukan perhitungan lagi.- Ketika melakukan operasi hitung, operator dan angka yang diinputkan user akan disimpan ke
history_operasidalam bentuk tuple(operator, angka). Misalnya, kita melakukan operasi + 2, nanti Stack akan menyimpannya dalam bentuk (“+”, 2). Setiap operasi hitung yang baru saja disimpan kehistory_operasiotomatis menjadi TOP. - Setelah melakukan operasi hitung, program akan menampilkan hasil operasi dengan format
{hasil_sebelumnya} {operator} {angka} = {self.hasil}seperti gambar output di bawah ini.

Keterangan: *24 = angka_awal = hasil = hasil_sebelumnya, + = operator, 2 = angka yang diinputkan user, dan 26.0 = hasil.*
3. Definisi Fungsi undo dengan Metode pop()
def undo(self):
if self.history_operasi:
operator, angka = self.history_operasi.pop()
if operator == "+":
self.hasil -= angka
elif operator == "-":
self.hasil += angka
elif operator == "*":
self.hasil /= angka
elif operator == "/":
self.hasil *= angka
print(f"⬅️ Undo: Membatalkan operasi '{operator} {angka}',\n🧩 Hasil kembali menjadi: {self.hasil}\n")
else:
print("🚫 Tidak ada yang bisa di-Undo\n")
Fungsi ini digunakan untuk membatalkan atau undo operasi perhitungan dari yang paling terakhir dilakukan dengan menggunakan history_operasi.pop(). Berikut ini adalah cara kerja fungsi undo:
- Jika operasi penjumlahan di undo, maka program akan mengurangi hasil dari operasi penjumlahan tersebut, begitu juga sebaliknya.
- Jika operasi perkalian di undo, maka program akan membagi hasil dari operasi perkalian tersebut, begitu juga sebaliknya.
Cara kerja di atas hanya berlaku ketika Stack history_operasi telah berisi elemen history operasi hitung saja (saat kita sudah melakukan operasi perhitungan). Jadi, jika Stack dalam keadaan kosong, program akan menampilkan pesan Tidak ada yang bisa di-Undo.
4. Main: Meminta Input User dan Menentukan Angka Awal
NPM = input("Masukkan NPM-mu : ")
angka_awal = int(NPM[-2:])
print(f"🧩 Angka awal : {angka_awal}\n")
- Program meminta user untuk memasukkan NPM-nya dengan perintah
input(""). - Variabel
angka_awalakan menentukan angka awal yang akan digunakan dalam operasi perhitungan.int(NPM[-2:])akan mengambil 2 digit terakhir dari NPM yang dimasukkan user. Kemudian, nilai awal ini akan ditampilkan sebagai output menggunakan perintahprint().
5. Main: Membuat Objek hitung
hitung = Kalkulator(angka_awal)
Objek hitung digunakan untuk melakukan operasi hitung dalam program, dengan nilai awal angka_awal yang telah diinputkan user.
6. Main: Opsi yang Tersedia untuk User
while True:
perintah = input("Masukkan operasi (+)(-)(*)(/) \n['Undo' untuk membatalkan]['x' untuk keluar] : ").lower()
# Memproses input user
# Jika user mimilih 'undo' atau 'x'
if perintah == 'undo':
hitung.undo()
continue
elif perintah == 'x':
print("👋🏻 Anda Keluar dari program. Terima kasih")
break
# Validasi operator
if perintah not in ['+', '-', '*', '/', 'undo', 'x']:
print("❌ Operator tidak valid!\n")
continue
User akan diminta program untuk memilih opsi yang telah disediakan, yaitu:
+: untuk melakukan operasi penjumlahan.-: untuk melakukan operasi pengurangan.*: untuk melakukan operasi perkalian./: untuk melakukan operasi pembagian.undo: untuk membatalkan operasi hitung yang terakhir dilakukan dan kembali ke operasi sebelumnya. Posisi TOP secara otomatis akan berpindah ke operasi sebelumnya.x: untuk keluar dari program.
Selanjutnya, program akan mengecek apakah user memberikan input opsi yang sesuai atau tidak di baris kode validasi operator. Jika user memberi input selain +, -, *, /, undo, dan x, program akan menampilkan pesan kesalahan Operator tidak valid!.
# Validasi operator
if perintah not in ['+', '-', '*', '/', 'undo', 'x']:
print("❌ Operator tidak valid!\n")
continue
7. Main: Meminta Input angka ke User
# Validasi input angka
while True:
try:
angka = float(input("Masukkan angka : "))
break
except ValueError:
print("❌ Input tidak valid! Masukkan angka dengan benar.")
User diminta untuk memasukkan angka yang nantinya akan digunakan dalam operasi perhitungan. Input harus berupa angka. Program akan menyimpannya sebagai tipe data float untuk mempermudah perhitungan angka desimal. Jika user memasukkan huruf atau karakter lain, program akan menampilkan pesan error Input tidak valid! Masukkan angka dengan benar..
8. Output
Masukkan NPM-mu : 2420506024
🧩 Angka awal : 24
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : +
Masukkan angka : 2
🚥 Operasi: 24 + 2.0 = 26.0
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : -
Masukkan angka : 6
🚥 Operasi: 26.0 - 6.0 = 20.0
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : u
❌ Operator tidak valid!
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : *
Masukkan angka : lima
❌ Input tidak valid! Masukkan angka dengan benar.
Masukkan angka : 5
🚥 Operasi: 20.0 * 5.0 = 100.0
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : undo
⬅️ Undo: Membatalkan operasi '* 5.0',
🧩 Hasil kembali menjadi: 20.0
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : undo
⬅️ Undo: Membatalkan operasi '- 6.0',
🧩 Hasil kembali menjadi: 26.0
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : undo
⬅️ Undo: Membatalkan operasi '+ 2.0',
🧩 Hasil kembali menjadi: 24.0
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : undo
🚫 Tidak ada yang bisa di-Undo
Masukkan operasi (+)(-)(*)(/)
['Undo' untuk membatalkan]['x' untuk keluar] : x
👋🏻 Anda Keluar dari program. Terima kasih
Latihan 2 - Implementasi Stack dengan collections.deque
# Latihan 2
# Program Navigasi History Aplikasi Mobile
from collections import deque
# Kelas untuk menyimpan riwayat fitur yang dikunjungi di aplikasi mobile
class AppHistory:
# Stack untuk menyimpan history
def __init__(self):
self.history = deque()
# Fungsi untuk menambahkan riwayat fitur yang dikunjungi ke Stack
def kunjunganfitur(self, fitur):
self.history.append(fitur)
print(f"⌛ Mengunjungi fitur: {fitur}")
# Fungsi kembali ke fitur sebelumnya dalam Stack
def back(self):
if self.history:
print(f"🔙 Kembali ke: {self.history.pop()}")
else:
print("🚫 Tidak ada riwayat!")
# ======= Program Utama ======= #
# Meminta input user
bulan_lahir = input("Masukkan bulan lahir (ex. Januari): ")
NPM = input("Masukkan NPM-mu: ")
print()
# Membuat nama fitur berdasarkan huruf pertama bulan lahir dan 2 digit terakhir NPM
namafitur = bulan_lahir[0].upper() + NPM[-2:]
# Objek navigasi untuk menyimpan riwayat fitur yang dikunjungi
navigasi = AppHistory()
# Menyimpan minimal 3 fitur yang dikunjungi ke dalam Stack
navigasi.kunjunganfitur(f"{namafitur}-01")
navigasi.kunjunganfitur(f"{namafitur}-02")
navigasi.kunjunganfitur(f"{namafitur}-03")
# Menampilkan opsi yang tersedia untuk user
while True:
command = input("\nTekan 'b' untuk kembali, 'x' untuk exit : ").lower()
# Memproses input user
if command == 'b':
navigasi.back()
elif command == 'x':
print("👋🏻 Keluar dari program. Terima kasih!")
break
else:
print("❌ Invalid input!")
1. Import deque dari Modul collections
from collections import deque
deque digunakan untuk menyimpan riwayat navigasi fitur. Dengan deque, operasi push dan pop dapat dilakukan di elemen awal maupun elemen akhir Stack.
2. Definisi class dan Stack
class AppHistory:
def __init__(self):
self.history = deque()
class AppHistory akan menyimpan riwayat fitur yang telah dikunjungi. Kelas ini memiliki atribut history yang didefinisikan sebagai Stack untuk menyimpan fitur yang telah dikunjungi.
3. Definisi Fungsi kunjunganfitur dengan Metode .append() untuk Push
def kunjunganfitur(self, fitur):
self.history.append(fitur)
print(f"⌛ Mengunjungi fitur: {fitur}")
Fitur yang dikunjungi akan ditambahkan ke dalam Stack menggunakan metode .append() yang ada di dalam fungsi kunjunganfitur(). Setiap fitur yang dikunjungi akan ditampilkan sebagai output menggunakan perintah print().
4. Definisi Fungsi back dengan Metode pop()
def back(self):
if self.history:
print(f"🔙 Kembali ke: {self.history.pop()}")
else:
print("🚫 Tidak ada riwayat!")
Fungsi back digunakan untuk kembali ke fitur yang terakhir dikunjungi menggunakan history.pop(). Fungsi ini akan mengecek apakah Stack history kosong atau tidak. Jika Stack kosong, program akan menampilkan pesan error Tidak ada riwayat!.
5. Main: Meminta Input User dan Menentukan Nama Fitur
bulan_lahir = input("Masukkan bulan lahir (ex. Januari): ")
NPM = input("Masukkan NPM-mu: ")
print()
namafitur = bulan_lahir[0].upper() + NPM[-2:]
- User diminta untuk menginputkan bulan lahirnya sesuai dengan ketentuan yang diberikan.
- User juga diminta untuk menginputkan NPM-nya dalam bentuk angka numerik.
bulan_lahir[0].upper()akan mengambil huruf pertama dari bulan lahir yang diinputkan user dan mengubahnya menjadi huruf kapital.NPM[-2:]akan mengambil 2 digit terakhir dari NPM yang diinputkan user. Keduanya akan digabungkan untuk membentuk nama fitur.
6. Main: Membuat objek navigasi
navigasi = AppHistory()
Objek navigasi digunakan untuk menyimpan dan mengelola riwayat fitur aplikasi yang dikunjungi, termasuk menambah fitur yang dikunjungi dan kembali ke fitur sebelumnya.
7. Main: Menambahkan Min. 3 Fitur yang Dikunjungi ke dalam Stack
navigasi.kunjunganfitur(f"{namafitur}-01")
navigasi.kunjunganfitur(f"{namafitur}-02")
navigasi.kunjunganfitur(f"{namafitur}-03")
Menambahkan 3 fitur ke dalam Stack dengan menggunakan dot notation (navigasi.) untuk memanggil fungsi kunjungan fitur. Setiap fitur akan disimpan ke dalam Stack dengan format {namafitur}-01, {namafitur}-02, dan {namafitur}-03, dimana {namafitur} adalah kombinasi huruf pertama bulan lahir dan 2 digit terakhir NPM yang diinputkan user.
8. Main: Opsi yang Tersedia untuk User
while True:
command = input("\nTekan 'b' untuk kembali, 'x' untuk exit : ").lower()
# Memproses input pengguna
if command == 'b':
navigasi.back()
elif command == 'x':
print("👋🏻 Keluar dari program. Terima kasih!")
break
else:
print("❌ Invalid input!")
Program akan meminta user untuk memilih opsi yang telah disediakan, yaitu:
b: untuk kembali ke fitur sebelumnyax: untuk keluar dari program
Jika user memberi input selain 2 opsi di atas, program akan menampilkan pesan error Invalid input!.
9. Output
Masukkan bulan lahir (ex. Januari): april
Masukkan NPM-mu: 2420506024
⌛ Mengunjungi fitur: A24-01
⌛ Mengunjungi fitur: A24-02
⌛ Mengunjungi fitur: A24-03
Tekan 'b' untuk kembali, 'x' untuk exit : <
❌ Invalid input!
Tekan 'b' untuk kembali, 'x' untuk exit : b
🔙 Kembali ke: A24-03
Tekan 'b' untuk kembali, 'x' untuk exit : b
🔙 Kembali ke: A24-02
Tekan 'b' untuk kembali, 'x' untuk exit : b
🔙 Kembali ke: A24-01
Tekan 'b' untuk kembali, 'x' untuk exit : b
🚫 Tidak ada riwayat!
Tekan 'b' untuk kembali, 'x' untuk exit : x
👋🏻 Keluar dari program. Terima kasih!
Latihan 3 - Implementasi Stack dengan queue.LifoQueue
# Latihan 3
# Sistem Penyimpanan Draft Email
from queue import LifoQueue
# Kelas untuk menyimpan draft email dalam Stack
class DraftEmail:
# Stack untuk menyimpan draft email
def __init__(self):
self.drafts = LifoQueue()
# Fungsi untuk menyimpan draft email dengan format (subjek, isi) ke dalam Stack
def savedrafts(self, subjek, isi):
self.drafts.put((subjek, isi))
print(f"✉️ Draft email dengan subjek '{subjek}' disimpan!")
# Fungsi untuk menampilkan draft email terakhir
def latestdraft(self):
if not self.drafts.empty():
subject, isi = self.drafts.queue[-1]
print(f"\n📧 Draft terakhir 📧 \n👤 Subjek: {subjek}\n📃 Isi: {isi}\n")
return
else:
print("🚫 Tidak ada draft yang tersimpan!")
return
# ======= Program utama ======= #
# Meminta input user
nama = input("Masukkan nama panggilanmu :")
NPM = input("Masukkan NPM-mu :")
# Mengambil 2 huruf pertama nama + dua digit terakhir NPM untuk subjek email
subjek = nama[:2].upper() + NPM[-2:]
print(f"\n👤 Subjek: {subjek}\n")
# Definisi objek untuk menyimpan draft email
draft = DraftEmail()
# Loop untuk membuat dan menyimpan 3 draft email
for i in range(3):
isi = input(f"📝 Isi email ke subjek {subjek} : ")
draft.savedrafts(subjek, isi)
print(f"✅ Draft ke-{i+1} telah disimpan!\n")
# Menampilkan opsi yang tersedia untuk user
while True:
print("⭐ Opsi: \np = Tampilkan draft terakhir \nx = Keluar dari program")
pilihan = input("Pilih opsi: ").lower()
# Memproses input user
if pilihan == 'p': # Jika user memilih lihat draft terakhir
draft.latestdraft()
elif pilihan == 'x': # Jika user memilih keluar dari program
print("👋 Keluar dari program. Terima kasih!\n")
break
else:
print("❌ Opsi tidak valid! Silakan pilih [p] atau [x].\n")
1. Import LifoQueue dari Modul queue
from queue import LifoQueue
LifoQueue adalah Stack bawaan modul queue Python yang bekerja dengan prinsip Last In, First Out (LIFO). Dalam program ini, draft email yang terakhir disimpan akan menjadi draft pertama yang ditampilkan saat user ingin melihat isi draft.
2. Definisi class dan Stack
class DraftEmail:
def __init__(self):
self.drafts = LifoQueue()
Stack self.drafts diinisialisasi di dalam class DraftEmail menggunakan LifoQueue. Stack ini akan menyimpan draft email dalam bentuk pasangan (subjek, isi) dengan menerapkan prinsip LIFO.
3. Definisi Fungsi savedrafts dengan Metode .put()
def savedrafts(self, subjek, isi):
self.drafts.put((subjek, isi))
print(f"✉️ Draft email dengan subjek '{subjek}' disimpan!")
Fungsi savedrafts akan menambahkan draft email ke Stack dengan menggunakan perintah self.drafts.put(). Draft email akan disimpan dalam bentuk pasangan (subjek, isi).
4. Definisi Fungsi latestdraft dengan Operasi peek()
def latestdraft(self):
if not self.drafts.empty():
subject, isi = self.drafts.queue[-1]
print(f"\n📧 Draft terakhir 📧 \n👤 Subjek: {subjek}\n📃 Isi: {isi}\n")
return
else:
print("🚫 Tidak ada draft yang tersimpan!")
return
Fungsi ini akan menampilkan isi draft terakhir yang ditambahkan. Namun, sebelum itu, fungsi ini akan mengecek apakah Stack dalam keadaan kosong atau isi.
- Jika Stack dalam keadaan isi, program akan menampilkan draft terakhir menggunakan perintah
self.drafts.queue[-1]. - Jika Stack dalam keadaan kosong, program akan menampilkan pesan error
Tidak ada draft yang tersimpan!.
5. Main: Meminta Input User dan Menentukan Subjek Email
nama = input("Masukkan nama panggilanmu :")
NPM = input("Masukkan NPM-mu :")
subjek = nama[:2].upper() + NPM[-2:]
print(f"\n👤 Subjek: {subjek}\n")
- User diminta untuk menginputkan nama panggilannya.
- User juga diminta untuk menginputkan NPM-nya dalam bentuk angka.
- Program akan mengambil 2 huruf pertama nama dalam bentuk huruf kapital (
nama[:2].upper()) dan menggabungkannya dengan 2 digit terakhir NPM (NPM[-2:]) yang diinputkan user. Gabungan keduanya akan digunakan sebagai subjek email.
6. Main: Membuat Objek draft
draft = DraftEmail()
Objek draft digunakan untuk menyimpan draft baru (savedrafts) dan menampilkan draft email terakhir (latestdraft). Setelah objek ini dibuat, kita bisa memanggil metode/fungsi dari kelas DrafEmail dengan menggunakan dot notation.
7. Main: Membuat dan Menyimpan Draft Email ke Stack (Min. 3 Draft)
for i in range(3):
isi = input(f"📝 Isi email ke subjek {subjek} : ")
draft.savedrafts(subjek, isi)
print(f"✅ Draft ke-{i+1} telah disimpan!\n")
Draft email dibuat dan disimpan menggunakan loop for. Loop ini akan beriterasi sebanyak 3 kali, sehingga jumlah draft yang bisa dibuat itu hanya 3 saja. Setiap selesai beriterasi, program akan menambahkan draft email ke dalam Stack dalam bentuk pasangan (subjek, isi).
8. Main: Opsi yang Tersedia untuk User
while True:
print("⭐ Opsi: \np = Tampilkan draft terakhir \nx = Keluar dari program")
pilihan = input("Pilih opsi: ").lower()
# Memproses input user
if pilihan == 'p': # Jika user memilih lihat draft terakhir
draft.latestdraft()
elif pilihan == 'x': # Jika user memilih keluar dari program
print("👋 Keluar dari program. Terima kasih!\n")
break
else:
print("❌ Opsi tidak valid! Silakan pilih [p] atau [x].\n")
Program akan menampilkan semua opsi yang bisa dipilih user. Opsi tersebut yaitu opsi p untuk menampilkan draft terakhir dan opsi x untuk keluar dari program. Jika user memberi input diluar dua opsi di atas, program akan menampilkan pesan error Opsi tidak valid! Silakan pilih [p] atau [x].
9. Output
Masukkan nama panggilanmu :hani
Masukkan NPM-mu :2420506024
👤 Subjek: HA24
📝 Isi email ke subjek HA24 : haloo
✉️ Draft email dengan subjek 'HA24' disimpan!
✅ Draft ke-1 telah disimpan!
📝 Isi email ke subjek HA24 : nama ku hani
✉️ Draft email dengan subjek 'HA24' disimpan!
✅ Draft ke-2 telah disimpan!
📝 Isi email ke subjek HA24 : salam kenal yaaaa~ ; D
✉️ Draft email dengan subjek 'HA24' disimpan!
✅ Draft ke-3 telah disimpan!
⭐ Opsi:
p = Tampilkan draft terakhir
x = Keluar dari program
Pilih opsi: p
📧 Draft terakhir 📧
👤 Subjek: HA24
📃 Isi: salam kenal yaaaa~ ; D
⭐ Opsi:
p = Tampilkan draft terakhir
x = Keluar dari program
Pilih opsi: x
👋 Keluar dari program. Terima kasih!
Latihan 4 - Implementasi Stack dengan OOP
# Latihan 4
# Sistem Antrean Tiket Bioskop
# Kelas untuk menyimpan antrean tiket bioskop yang dibeli ke dalam Stack
class TiketBioskop:
# Stack untuk menyimpan tiket
def __init__(self):
self.tiket = []
# Fungsi untuk menyimpan tiket yang dibeli ke Stack
def tambahtiket(self, tiket):
self.tiket.append(tiket)
print(f"🎫 Tiket {tiket} ditambahkan ke antrean.")
# Fungsi untuk memproses tiket dari tiket terakhir yang dibeli dengan pop()
def prosestiket(self):
if not self.isEmpty():
print(f"⌛ Memproses tiket: {self.tiket.pop()}")
return
else:
print("🚫 Tidak ada tiket yang harus diproses.")
# isEmpty() memeriksa kekosongan Stack tiket
def isEmpty(self):
return len(self.tiket) == 0
# ======= Program utama ======= #
# Meminta input bulan lahir dan NPM
bulan_lahir = input("Masukkan bulan lahir (ex. Januari): ").upper()
NPM = input("Masukkan NPM-mu: ")
# Membuat nama film berdasarkan huruf pertama bulan lahir dan 2 digit terakhir NPM
namafilm = bulan_lahir[0] + NPM[-2:]
print(f"\n🎥 Film {namafilm}")
# Objek untuk antrean tiket bioskop
antretiket = TiketBioskop()
# Meminta input jumlah tiket yang ingin dibeli
belitiket = int(input("\n🎫 Jumlah tiket yang dibeli: "))
for i in range(belitiket):
antretiket.tambahtiket(f"{namafilm}-Tiket0{i+1}")
# Menampilkan opsi yang tersedia untuk user
print("\n⭐ Opsi: \np = Proses tiket \nx = Keluar dari program")
while True:
pilihan = input("\nMasukkan opsi : ").lower()
# Memproses input user
if pilihan == 'p':
antretiket.prosestiket()
elif pilihan == 'x':
print("👋 Keluar dari program. Terima kasih!\n")
break
else:
print("❌ Opsi tidak valid! Silakan pilih [p] atau [x].\n")
1. Definisi class dan Stack
class TiketBioskop:
def __init__(self):
self.tiket = []
class TiketBioskop akan mengelola antrean tiket, termasuk menyimpan dan memproses tiket yang dipesan oleh customer (user). Di dalam kelas ini, Stack tiket didefinisikan untuk menyimpan tiket yang dibeli.
2. Definisi Fungsi tambahtiket dengan metode .append()
def tambahtiket(self, tiket):
self.tiket.append(tiket)
print(f"🎫 Tiket {tiket} ditambahkan ke antrean.")
tambahtiket digunakan untuk menambahkan tiket yang dibeli ke dalam antrean. Tiket tersebut akan disimpan di Stack dengan menggunakan perintah self.tiket.append(tiket). Hal ini akan membuat tiket yang terakhir di beli akan berada di posisi TOP, sesuai dengan prinsip LIFO.
3. Definisi Fungsi prosestiket dengan Metode pop()
def prosestiket(self):
if not self.isEmpty():
print(f"⌛ Memproses tiket: {self.tiket.pop()}")
return
else:
print("🚫 Tidak ada tiket yang harus diproses.")
prosestiket digunakan untuk memproses tiket yang telah dibeli sebelumnya. Sebelum memeproses tiket, fungsi ini akan mengecek kondisi Stack atau antrean dengan memanggil fungsi isEmpty(). Fungsi isEmpty() akan memeriksa kondisi Stack berikut:
- Jika Stack isi, program akan mulai memproses tiket menggunakan perintah
self.tiket.pop(). Berdasarkan prinsip LIFO, urutan pemrosesan tiket dimulai dari tiket yang terakhir dibeli. - Jika Stack kosong, program akan menampilkan pesan error
Tidak ada tiket yang harus diproses.
4. Fungsi isEmpty() untuk Mengecek Kondisi Stack
def isEmpty(self):
return len(self.tiket) == 0
Fungsi isEmpty(self) digunakan untuk mengecek apakah Stack dalam kondisi kosong atau tidak. Dalam program ini, fungsi ini akan dipanggil sebelum tiket diproses.
5. Main: Meminta Input User dan Menentukan Nama Film
bulan_lahir = input("Masukkan bulan lahir (ex. Januari): ").upper()
NPM = input("Masukkan NPM-mu: ")
namafilm = bulan_lahir[0] + NPM[-2:]
print(f"\n🎥 Film {namafilm}")
- User diminta untuk menginputkan bulan lahirnya sesuai dengan ketentuan yang diberikan. Variabel
bulan_lahirakan menyimpan nama bulan lahir dengan huruf kapital menggunakan fungsi.upper(). - User juga diminta untuk memasukkan NPM-nya dalam bentuk angka.
- Program akan mengambil huruf pertama nilai
bulan_lahirdan menggabungkannya dengan 2 digit terakhirNPM. Gabungan dari keduanya akan digunakan sebagai nama film.
6. Main: Membuat Objek antretiket
antretiket = TiketBioskop()
Objek antretiket digunakan untuk menambahkan tiket (tambahtiket), memproses tiket (prosestiket), dan memeriksa kekosongan Stack(isEmpty).
7. Main: Meminta Input User untuk Memasukkan Jumlah Tiket yang Ingin Dibeli
belitiket = int(input("\n🎫 Jumlah tiket yang dibeli: "))
for i in range(belitiket):
antretiket.tambahtiket(f"{namafilm}-Tiket0{i+1}")
User diminta untuk menginputkan jumlah tiket yang ingin dibeli. Selanjutnya, program akan menambahkan tiket sebanyak jumlah tiket yang dimasukkan user secara satu per satu menggunakan loop for. Setiap tiket yang ditambahkan ke Stack disimpan dalam format {namafilm}-Tiket{i+1}.
8. Main: Opsi yang Tersedia untuk User
print("\n⭐ Opsi: \np = Proses tiket \nx = Keluar dari program")
while True:
pilihan = input("\nMasukkan opsi : ").lower()
# Memproses input user
if pilihan == 'p':
antretiket.prosestiket()
elif pilihan == 'x':
print("👋 Keluar dari program. Terima kasih!\n")
break
else:
print("❌ Opsi tidak valid! Silakan pilih [p] atau [x].\n")
Program akan menampilkan semua opsi yang bisa dipilih user. Opsi tersebut yaitu opsi p untuk memproses tiket dalam antrean dan opsi x untuk keluar dari program. Jika user memberi input diluar dua opsi di atas, program akan menampilkan pesan error Opsi tidak valid! Silakan pilih [p] atau [x].
9. Output
Masukkan bulan lahir (ex. Januari): april
Masukkan NPM-mu: 24
🎥 Film A24
🎫 Jumlah tiket yang dibeli: 4
🎫 Tiket A24-Tiket01 ditambahkan ke antrean.
🎫 Tiket A24-Tiket02 ditambahkan ke antrean.
🎫 Tiket A24-Tiket03 ditambahkan ke antrean.
🎫 Tiket A24-Tiket04 ditambahkan ke antrean.
⭐ Opsi:
p = Proses tiket
x = Keluar dari program
Masukkan opsi : p
⌛ Memproses tiket: A24-Tiket04
Masukkan opsi : p
⌛ Memproses tiket: A24-Tiket03
Masukkan opsi : p
⌛ Memproses tiket: A24-Tiket02
Masukkan opsi : p
⌛ Memproses tiket: A24-Tiket01
Masukkan opsi : p
🚫 Tidak ada tiket yang harus diproses.
Masukkan opsi : x
👋 Keluar dari program. Terima kasih!
Tugas

Penyelesaian dan Penjelasan:
# Simulasi Tumpukan Barang dalam Gudang
# Kelas untuk menyimpan tumpukan barang di gudang
class GudangBarang:
# Stack untuk menyimpan barang sesuai kapasitas
def __init__(self, kapasitas):
self.barang = []
self.kapasitas = kapasitas
# push : Menambahkan barang baru ke gudang
def tambahbarang(self, namabarang):
if len(self.barang) < self.kapasitas:
self.barang.append(namabarang)
print(f"📦 {namabarang} ditambahkan ke gudang.")
else:
print(f"⛔ Gudang penuh! {namabarang} tidak bisa ditambahkan. ⛔")
# pop : Mengambil barang yang terakhir masuk ke gudang
def ambilbarang(self):
if self.barang:
barangkeluar = self.barang.pop()
print(f"🔺Ambil barang: {barangkeluar} ")
else:
print("⛔ Gudang kosong! Tidak ada barang yang bisa diambil. ⛔")
# Fungsi untuk menampilkan daftar barang dalam gudang
def lihatbarang(self):
if self.barang:
print("📋 Daftar Barang dalam Gudang (TOP = Last in)📋")
for namabarang in reversed(self.barang):
print(f" 📦 {namabarang}")
else:
print("⛔ Gudang kosong! Tidak ada barang di gudang. ⛔")
# =========== Program Utama =========== #
# Meminta input user
NPM = input("Masukkan NPM-mu : ")
# Menentukan jumlah max barang dalam gudang
# berdasarkan 2 digit terakhir NPM
maxbarang = int(NPM[-2:])
print(f"📦 Jumlah maksimal barang dalam gudang : {maxbarang} 📦")
# Definisi objek untuk mengelola barang dalam gudang
gudang = GudangBarang(maxbarang)
# Menampilkan opsi yang tersedia untuk user
print("\n⭐ Opsi yang dapat dipilih ⭐")
print(" + : tambah barang")
print(" - : ambil barang")
print(" sh : lihat barang di gudang")
print(" x : keluar")
# Menampilkan opsi yang tersedia untuk user
while True:
pilihan = input("\nMasukkan opsi: ").lower()
# Memproses input user
if pilihan == '+':
namabarang = input("Masukkan nama barang: ")
gudang.tambahbarang(namabarang)
elif pilihan == '-':
gudang.ambilbarang()
elif pilihan == 'sh':
gudang.lihatbarang()
elif pilihan == 'x':
print("👋🏻 Keluar dari program. Terima kasih!")
break
else:
print("❌ Invalid input!")
1. Definisi class dan Stack
class GudangBarang:
def __init__(self, kapasitas):
self.barang = []
self.kapasitas = kapasitas
class GudangBarang akan mengelola barang yang ada di gudang, seperti menambahkan barang dan mengambil barang. Dalam kelas ini, Stack barang didefinisikan untuk menyimpan daftar barang yang ada di gudang. Selain itu, atribut self.kapasitas digunakan untuk menentukan jumlah maksimal barang yang bisa disimpan di gudang.
2. Definisi Fungsi tambahbarang dengan Operasi push() dan Metode .append()
def tambahbarang(self, namabarang):
if len(self.barang) < self.kapasitas:
self.barang.append(namabarang)
print(f"📦 {namabarang} ditambahkan ke gudang.")
else:
print(f"⛔ Gudang penuh! {namabarang} tidak bisa ditambahkan. ⛔")
tambahbarang digunakan untuk menambahkan barang ke gudang dengan perintah self.barang.append(). Sebelum menambahkan barang ke gudang, program akan mengecek apakah banyak barang yang ada di dalam gudang kurang dari kapasitas yang tersedia atau tidak.
- Jika banyak barang kurang dari kapasitas barang, program akan menambahkan barang baru ke dalam gudang.
- Jika banyak barang dalam gudang melebihi kapasitas, program tidak menambahkan barang baru ke gudang dan akan menampilkan pesan error
Gudang penuh! {namabarang} tidak bisa ditambahkan.
3. Definisi Fungsi ambilbarang dengan Operasi pop()
def ambilbarang(self):
if self.barang:
barangkeluar = self.barang.pop()
print(f"🔺Ambil barang: {barangkeluar} ")
else:
print("⛔ Gudang kosong! Tidak ada barang yang bisa diambil. ⛔")
ambilbarang digunakan untuk mengambil barang yang ada di dalam gudang dengan perintah self.barang.pop(). Sebelum mengambil barang, program akan mengecek apakah Stack atau gudang dalam keadaan kosong atau tidak.
- Jika Stack isi, program akan mengambil barang yang ada di gudang. Barang di gudang diambil dengan menggunakan prinsip LIFO, yaitu barang yang terakhir masuk akan berada di tumpukan paling atas (TOP), dan barang inilah yang akan diambil pertama kali.
- Jika Stack kosong, program akan menampilkan pesan error
Gudang kosong! Tidak ada barang yang bisa diambil.
4. Definisi Fungsi lihatbarang
def lihatbarang(self):
if self.barang:
print("📋 Daftar Barang dalam Gudang (TOP = Last in)📋")
for namabarang in reversed(self.barang):
print(f" 📦 {namabarang}")
else:
print("⛔ Gudang kosong! Tidak ada barang di gudang. ⛔")
lihatbarang digunakan untuk menampilkan daftar seluruh barang yang ada di gudang. Sebelum menampilkan daftarnya, program akan mengecek apakah Stack dalam keadaan kosong atau isi.
- Jika Stack isi, program akan menampilkan nama barang yang ada di gudang. Barang yang ditampilkan berdasarkan prinsip LIFO, yaitu barang yang terakhir ditambahkan akan mengisi bagian atas daftar dalam Stack.
- Jika Stack kosong, program akan menampilkan pesan error
Gudang Kosong! Tidak ada barang di gudang..
5. Main: Meminta Input User dan Menetapkan Kapasitas Gudang
NPM = input("Masukkan NPM-mu : ")
maxbarang = int(NPM[-2:])
print(f"📦 Jumlah maksimal barang dalam gudang : {maxbarang} 📦")
- User diminta untuk menginputkan NPM-nya dalam bentuk angka.
int(NPM[-2:])akan mengambil 2 digit terakhir NPM yang diinputkan user untuk dijadikan jumlah maksimal barang dalam gudang.
6. Main: Membuat Objek gudang
gudang = GudangBarang(maxbarang)
Objek gudang didefinisikan dengan kapasitas tertentu. Objek ini digunakan untuk menambahkan barang yang akan disimpan di gudang, mengambil barang yang ada di gudang, dan melihat daftar barang yang ada di gudang dengan menggunakan dot notation gudang..
7. Main: Opsi yang Tersedia untuk User
print("\n⭐ Opsi yang dapat dipilih ⭐")
print(" + : tambah barang")
print(" - : ambil barang")
print(" sh : lihat barang di gudang")
print(" x : keluar")
while True:
pilihan = input("\nMasukkan opsi: ").lower()
# Memproses input pengguna
if pilihan == '+':
namabarang = input("Masukkan nama barang: ")
gudang.tambahbarang(namabarang)
elif pilihan == '-':
gudang.ambilbarang()
elif pilihan == 'sh':
gudang.lihatbarang()
elif pilihan == 'x':
print("👋🏻 Keluar dari program. Terima kasih!")
break
else:
print("❌ Invalid input!")
Program akan menampilkan semua opsi yang bisa dipilih user. Opsi tersebut yaitu:
+: untuk menambah barang-: untuk mengambil barangsh: untuk menampilkan daftar seluruh barang di gudangx: untuk keluar dari program
Jika user memberi input selain opsi di atas, program akan menampilkan pesan error Invalid input!.
8. Output
Masukkan NPM-mu : 2420506024
📦 Jumlah maksimal barang dalam gudang : 24 📦
⭐ Opsi yang dapat dipilih ⭐
+ : tambah barang
- : ambil barang
sh : lihat barang di gudang
x : keluar
Masukkan opsi: -
⛔ Gudang kosong! Tidak ada barang yang bisa diambil. ⛔
Masukkan opsi: sh
⛔ Gudang kosong! Tidak ada barang di gudang. ⛔
Masukkan opsi: +
Masukkan nama barang: kayu
📦 kayu ditambahkan ke gudang.
Masukkan opsi: +
Masukkan nama barang: kardus
📦 kardus ditambahkan ke gudang.
Masukkan opsi: +
Masukkan nama barang: kertas
📦 kertas ditambahkan ke gudang.
Masukkan opsi: kardus
❌ Invalid input!
Masukkan opsi: +
Masukkan nama barang: kardus
📦 kardus ditambahkan ke gudang.
Masukkan opsi: sh
📋 Daftar Barang dalam Gudang (TOP = Last in)📋
📦 kardus
📦 kertas
📦 kardus
📦 kayu
Masukkan opsi: -
🔺Ambil barang: kardus
Masukkan opsi: -
🔺Ambil barang: kertas
Masukkan opsi: -
🔺Ambil barang: kardus
Masukkan opsi: -
🔺Ambil barang: kayu
Masukkan opsi: -
⛔ Gudang kosong! Tidak ada barang yang bisa diambil. ⛔
Masukkan opsi: x
👋🏻 Keluar dari program. Terima kasih!
Link
Referensi
Wardhani, O., & Alfath, I. (2024). Modul Praktikum Struktur Data: Stack. Teknologi Informasi, Universitas Tidar.

메타데이터
- post_id
- 1c93aeb306e2
- slug
- struktur-data-stack-1c93aeb306e2
- url
- https://medium.com/@zahrahani/struktur-data-stack-1c93aeb306e2
- canonical_url
- https://medium.com/@zahrahani/struktur-data-stack-1c93aeb306e2
- author_url
- https://medium.com/@zahrahani
- status
- ok
- fetched_at
- 2026-07-24 00:35:28