Struktur Data dan Algoritma Python Kelas XI: List, Dictionary, Stack, Queue, Searching, dan Sorting
KKA Kelas XI Semester 1 – Pertemuan 9 – 2 JP × 45 Menit
Materi ini dirancang untuk membantu siswa memahami konsep struktur data dan algoritma Python melalui praktik langsung.
Struktur data dan algoritma merupakan bagian penting dalam pembelajaran pemrograman Python. Melalui materi ini, siswa kelas XI mempelajari bagaimana data disimpan, dicari, diurutkan, dimasukkan ke dalam antrean, diproses, dan dicatat sebagai riwayat aktivitas.
Konsep yang dipelajari meliputi list, dictionary, stack, queue, linear search, sorting, fungsi, perulangan, percabangan, validasi input, dan debugging.
Hasil Akhir Praktik
Setiap kelompok akan menghasilkan program pengelolaan produk dan antrean pesanan yang mampu:
- Menyimpan data produk.
- Menampilkan seluruh produk.
- Mencari produk berdasarkan kode.
- Mengurutkan produk berdasarkan harga.
- Mengurutkan produk berdasarkan stok.
- Menambahkan pesanan ke dalam antrean.
- Memproses pesanan berdasarkan urutan kedatangan.
- Mengurangi stok setelah pesanan diproses.
- Menyimpan riwayat aktivitas.
- Melakukan validasi input.
- Menolak jumlah pesanan yang tidak valid.
- Menolak pesanan yang melebihi stok.
- Menolak nomor pesanan yang sudah digunakan.
- Melakukan pengujian program.
- Menganalisis dan memperbaiki error.
Penerapan Struktur Data di Dunia Kerja
Struktur data digunakan dalam berbagai aplikasi digital. Pemilihan struktur data yang tepat membantu program menjadi lebih terstruktur, mudah diuji, dan mudah dikembangkan.
| Aplikasi Industri | Data yang Dikelola | Struktur Data |
|---|---|---|
| Aplikasi kasir | Produk, stok, harga, transaksi | List dan Dictionary |
| Marketplace | Produk, pesanan, pembayaran | List, Dictionary, Queue |
| Editor dokumen | Riwayat perubahan dan undo | Stack |
| Customer service | Antrean tiket pelanggan | Queue |
| Sistem gudang | Stok dan barang | Dictionary, Searching, Sorting |
| Sistem sekolah | Data siswa, nilai, kehadiran | List dan Dictionary |
1. List Python
List digunakan untuk menyimpan banyak nilai dalam satu variabel. Setiap elemen mempunyai indeks yang dimulai dari angka 0.
produk = ["Laptop", "Mouse", "Keyboard", "Printer"]
print(produk[0])
print(produk[2])
Hasil:
Laptop
Keyboard
Operasi Dasar List
produk = ["Laptop", "Mouse", "Keyboard"]
produk.append("Printer")
produk[1] = "Mouse Wireless"
produk.remove("Laptop")
jumlah_produk = len(produk)
print(produk)
print("Jumlah produk:", jumlah_produk)
| Perintah | Fungsi |
|---|---|
append() |
Menambahkan data di akhir list |
insert() |
Menyisipkan data |
remove() |
Menghapus berdasarkan nilai |
pop() |
Mengambil sekaligus menghapus elemen |
len() |
Menghitung jumlah elemen |
2. Dictionary Python
Dictionary menyimpan data menggunakan pasangan key dan value.
produk = {
"kode": "PRD001",
"nama": "Keyboard Mechanical",
"harga": 350000,
"stok": 12
}
print("Kode :", produk["kode"])
print("Nama :", produk["nama"])
print("Harga:", produk["harga"])
print("Stok :", produk["stok"])
List dan Dictionary
daftar_produk = [
{
"kode": "PRD001",
"nama": "Keyboard Mechanical",
"harga": 350000,
"stok": 12
},
{
"kode": "PRD002",
"nama": "Mouse Wireless",
"harga": 150000,
"stok": 20
},
{
"kode": "PRD003",
"nama": "Headset Gaming",
"harga": 275000,
"stok": 8
}
]
for produk in daftar_produk:
print(produk["kode"], "-", produk["nama"])
3. Stack Python – LIFO
Stack menggunakan prinsip Last In First Out (LIFO). Data terakhir masuk akan menjadi data pertama yang dikeluarkan.
riwayat = []
riwayat.append("Menambah produk PRD001")
riwayat.append("Mengubah stok PRD001")
riwayat.append("Mengubah harga PRD001")
print("Riwayat awal:", riwayat)
aksi_terakhir = riwayat.pop()
print("Aksi terakhir:", aksi_terakhir)
print("Riwayat sekarang:", riwayat)
4. Queue Python – FIFO
Queue menggunakan prinsip First In First Out (FIFO).
from collections import deque
antrean = deque()
antrean.append("ORD001")
antrean.append("ORD002")
antrean.append("ORD003")
print("Antrean awal:", list(antrean))
pesanan_diproses = antrean.popleft()
print("Pesanan diproses:", pesanan_diproses)
print("Sisa antrean:", list(antrean))
5. Linear Search
Linear search mencari data dengan memeriksa elemen satu per satu.
def cari_produk(data_produk, kode_dicari):
for produk in data_produk:
if produk["kode"].lower() == kode_dicari.lower():
return produk
return None
hasil = cari_produk(daftar_produk, "PRD002")
if hasil is not None:
print("Produk ditemukan:", hasil["nama"])
else:
print("Produk tidak ditemukan")
6. Sorting Python
Harga Termurah
produk_terurut = sorted(
daftar_produk,
key=lambda produk: produk["harga"]
)
for produk in produk_terurut:
print(produk["nama"], "-", produk["harga"])
Stok Terbanyak
produk_terurut = sorted(
daftar_produk,
key=lambda produk: produk["stok"],
reverse=True
)
for produk in produk_terurut:
print(produk["nama"], "-", produk["stok"])
7. Kompleksitas Algoritma
| Notasi | Penjelasan | Contoh |
|---|---|---|
| O(1) | Jumlah langkah relatif tetap | Akses list menggunakan indeks |
| O(n) | Bertambah mengikuti jumlah data | Linear search |
| O(log n) | Ruang pencarian dikurangi bertahap | Binary search |
| O(n log n) | Umum pada sorting efisien | Sorting tertentu |
| O(n²) | Perbandingan berulang | Bubble sort dasar |
8. Praktik Kelompok
Bentuk kelompok beranggotakan 4–6 siswa. Setiap anggota mendapatkan tugas dan melakukan rotasi.
| Peran | Tugas | Bukti |
|---|---|---|
| Analis | Menentukan masalah, input, proses, output | Tabel analisis |
| Perancang algoritma | Membuat pseudocode | Pseudocode |
| Programmer Thonny | Menulis dan menjalankan kode | File Python |
| Programmer Pydroid | Menguji kode di HP | Screenshot |
| Tester | Menguji program | Tabel pengujian |
| Dokumentator | Mencatat bug dan perbaikan | Laporan |
9. Program Python Lengkap
collections. Tidak membutuhkan library tambahan.
from collections import deque
==========================================================
SISTEM PRODUK DAN ANTREAN PESANAN
==========================================================
daftar_produk = [
{
"kode": "PRD001",
"nama": "Keyboard Mechanical",
"kategori": "Aksesori",
"harga": 350000,
"stok": 12
},
{
"kode": "PRD002",
"nama": "Mouse Wireless",
"kategori": "Aksesori",
"harga": 150000,
"stok": 20
},
{
"kode": "PRD003",
"nama": "Headset Gaming",
"kategori": "Audio",
"harga": 275000,
"stok": 8
},
{
"kode": "PRD004",
"nama": "Flashdisk 64 GB",
"kategori": "Penyimpanan",
"harga": 95000,
"stok": 25
},
{
"kode": "PRD005",
"nama": "Webcam HD",
"kategori": "Kamera",
"harga": 225000,
"stok": 10
}
]
antrean_pesanan = deque()
riwayat_aktivitas = []
nomor_pesanan_terdaftar = set()
def format_rupiah(nilai):
hasil = "Rp{:,.0f}".format(nilai)
return hasil.replace(",", ".")
def garis():
print("-" * 80)
def cari_produk(kode_dicari):
kode_dicari = kode_dicari.strip().lower()
for produk in daftar_produk:
if produk["kode"].lower() == kode_dicari:
return produk
return None
def nomor_pesanan_sudah_ada(nomor):
return nomor.strip().upper() in nomor_pesanan_terdaftar
def input_bilangan_bulat(pesan):
while True:
teks = input(pesan).strip()
try:
return int(teks)
except ValueError:
print("Input tidak valid. Masukkan angka bulat.")
def tampilkan_produk(data):
print("\nDAFTAR PRODUK")
garis()
print(
"{:<9} {:<24} {:<16} {:<16} {:<6}".format(
"Kode",
"Nama",
"Kategori",
"Harga",
"Stok"
)
)
garis()
if not data:
print("Tidak ada data produk.")
garis()
return
for produk in data:
print(
"{:<9} {:<24} {:<16} {:<16} {:<6}".format(
produk["kode"],
produk["nama"],
produk["kategori"],
format_rupiah(produk["harga"]),
produk["stok"]
)
)
garis()
def menu_cari_produk():
print("\nPENCARIAN PRODUK")
kode = input("Masukkan kode produk: ").strip()
if kode == "":
print("Kode produk tidak boleh kosong.")
return
hasil = cari_produk(kode)
if hasil is None:
print("Produk dengan kode", kode, "tidak ditemukan.")
return
print("\nProduk ditemukan")
garis()
print("Kode :", hasil["kode"])
print("Nama :", hasil["nama"])
print("Kategori :", hasil["kategori"])
print("Harga :", format_rupiah(hasil["harga"]))
print("Stok :", hasil["stok"])
garis()
def urutkan_harga_termurah():
hasil = sorted(
daftar_produk,
key=lambda produk: produk["harga"]
)
print("\nPRODUK DARI HARGA TERMURAH")
tampilkan_produk(hasil)
def urutkan_stok_terbanyak():
hasil = sorted(
daftar_produk,
key=lambda produk: produk["stok"],
reverse=True
)
print("\nPRODUK DARI STOK TERBANYAK")
tampilkan_produk(hasil)
def tambah_pesanan():
print("\nTAMBAH PESANAN")
nomor = input("Nomor pesanan : ").strip().upper()
if nomor == "":
print("Gagal: nomor pesanan tidak boleh kosong.")
return
if nomor_pesanan_sudah_ada(nomor):
print("Gagal: nomor pesanan sudah pernah digunakan.")
return
kode = input("Kode produk : ").strip().upper()
if kode == "":
print("Gagal: kode produk tidak boleh kosong.")
return
produk = cari_produk(kode)
if produk is None:
print("Gagal: kode produk tidak ditemukan.")
return
jumlah = input_bilangan_bulat("Jumlah pesanan: ")
if jumlah <= 0:
print("Gagal: jumlah harus lebih dari nol.")
return
if jumlah > produk["stok"]:
print("Gagal: stok tidak mencukupi.")
print("Stok tersedia:", produk["stok"])
return
pesanan = {
"nomor": nomor,
"kode_produk": produk["kode"],
"nama_produk": produk["nama"],
"jumlah": jumlah,
"total": produk["harga"] * jumlah,
"status": "Menunggu"
}
antrean_pesanan.append(pesanan)
nomor_pesanan_terdaftar.add(nomor)
riwayat_aktivitas.append(
"Menambahkan pesanan " + nomor
)
print("\nPesanan berhasil masuk antrean.")
print("Nomor pesanan :", nomor)
print("Produk :", produk["nama"])
print("Jumlah :", jumlah)
print("Total :", format_rupiah(pesanan["total"]))
def tampilkan_antrean():
print("\nANTREAN PESANAN")
garis()
if len(antrean_pesanan) == 0:
print("Antrean masih kosong.")
garis()
return
nomor_urut = 1
for pesanan in antrean_pesanan:
print(
str(nomor_urut) + ".",
pesanan["nomor"],
"|",
pesanan["nama_produk"],
"| Jumlah:",
pesanan["jumlah"],
"| Total:",
format_rupiah(pesanan["total"]),
"| Status:",
pesanan["status"]
)
nomor_urut += 1
garis()
def proses_pesanan():
print("\nPROSES PESANAN")
if len(antrean_pesanan) == 0:
print("Tidak ada pesanan yang dapat diproses.")
return
pesanan = antrean_pesanan[0]
produk = cari_produk(pesanan["kode_produk"])
if produk is None:
print("Gagal: produk tidak ditemukan.")
return
if pesanan["jumlah"] > produk["stok"]:
print("Gagal: stok sekarang tidak mencukupi.")
print("Stok tersedia:", produk["stok"])
return
pesanan = antrean_pesanan.popleft()
produk["stok"] -= pesanan["jumlah"]
pesanan["status"] = "Selesai"
riwayat_aktivitas.append(
"Memproses pesanan " + pesanan["nomor"]
)
print("\nPesanan berhasil diproses.")
print("Nomor :", pesanan["nomor"])
print("Produk :", pesanan["nama_produk"])
print("Jumlah :", pesanan["jumlah"])
print("Total :", format_rupiah(pesanan["total"]))
print("Status :", pesanan["status"])
print("Sisa stok :", produk["stok"])
def tampilkan_riwayat():
print("\nRIWAYAT AKTIVITAS")
garis()
if len(riwayat_aktivitas) == 0:
print("Belum ada aktivitas.")
garis()
return
nomor = 1
for aktivitas in riwayat_aktivitas:
print(str(nomor) + ".", aktivitas)
nomor += 1
garis()
def ambil_riwayat_terakhir():
print("\nAMBIL RIWAYAT TERAKHIR")
if len(riwayat_aktivitas) == 0:
print("Riwayat masih kosong.")
return
aktivitas = riwayat_aktivitas.pop()
print("Aktivitas terakhir:", aktivitas)
print("Aktivitas tersebut dikeluarkan dari stack.")
def tampilkan_stok_rendah():
print("\nPRODUK DENGAN STOK DI BAWAH 10")
garis()
ditemukan = False
for produk in daftar_produk:
if produk["stok"] < 10:
print(
produk["kode"],
"-",
produk["nama"],
"- Stok:",
produk["stok"]
)
ditemukan = True
if not ditemukan:
print("Tidak ada produk dengan stok rendah.")
garis()
def tampilkan_informasi():
print("\nINFORMASI PROGRAM")
garis()
print("Jumlah produk :", len(daftar_produk))
print("Jumlah antrean :", len(antrean_pesanan))
print("Jumlah aktivitas :", len(riwayat_aktivitas))
print(
"Nomor pesanan dibuat:",
len(nomor_pesanan_terdaftar)
)
garis()
def jalankan_tes_dasar():
print("\nTES DASAR PROGRAM")
garis()
semua_lulus = True
hasil = cari_produk("PRD002")
if hasil is not None and hasil["nama"] == "Mouse Wireless":
print("[LULUS] Linear search produk PRD002")
else:
print("[GAGAL] Linear search produk PRD002")
semua_lulus = False
hasil = cari_produk("PRD999")
if hasil is None:
print("[LULUS] Pencarian produk tidak tersedia")
else:
print("[GAGAL] Pencarian produk tidak tersedia")
semua_lulus = False
hasil_sort = sorted(
daftar_produk,
key=lambda produk: produk["harga"]
)
if hasil_sort[0]["kode"] == "PRD004":
print("[LULUS] Sorting harga termurah")
else:
print("[GAGAL] Sorting harga termurah")
semua_lulus = False
hasil_sort_stok = sorted(
daftar_produk,
key=lambda produk: produk["stok"],
reverse=True
)
if hasil_sort_stok[0]["kode"] == "PRD004":
print("[LULUS] Sorting stok terbanyak")
else:
print("[GAGAL] Sorting stok terbanyak")
semua_lulus = False
if len(daftar_produk) == 5:
print("[LULUS] Data awal produk")
else:
print("[GAGAL] Data awal produk")
semua_lulus = False
garis()
if semua_lulus:
print("Semua tes dasar berhasil.")
else:
print("Ada tes yang gagal.")
def tampilkan_menu():
print("\n==============================================")
print(" SISTEM PRODUK DAN ANTREAN PESANAN")
print(" Struktur Data dan Algoritma Python")
print("==============================================")
print("1. Tampilkan seluruh produk")
print("2. Cari produk")
print("3. Urutkan harga termurah")
print("4. Urutkan stok terbanyak")
print("5. Tambahkan pesanan")
print("6. Tampilkan antrean")
print("7. Proses pesanan")
print("8. Tampilkan riwayat")
print("9. Ambil riwayat terakhir")
print("10. Tampilkan produk stok rendah")
print("11. Tampilkan informasi program")
print("12. Jalankan tes dasar")
print("0. Keluar")
print("==============================================")
def program_utama():
while True:
tampilkan_menu()
try:
pilihan = input("Pilih menu: ").strip()
except (EOFError, KeyboardInterrupt):
print("\nProgram dihentikan.")
break
if pilihan == "1":
tampilkan_produk(daftar_produk)
elif pilihan == "2":
menu_cari_produk()
elif pilihan == "3":
urutkan_harga_termurah()
elif pilihan == "4":
urutkan_stok_terbanyak()
elif pilihan == "5":
tambah_pesanan()
elif pilihan == "6":
tampilkan_antrean()
elif pilihan == "7":
proses_pesanan()
elif pilihan == "8":
tampilkan_riwayat()
elif pilihan == "9":
ambil_riwayat_terakhir()
elif pilihan == "10":
tampilkan_stok_rendah()
elif pilihan == "11":
tampilkan_informasi()
elif pilihan == "12":
jalankan_tes_dasar()
elif pilihan == "0":
print("\nProgram selesai.")
print("Terima kasih.")
break
else:
print("Pilihan tidak tersedia.")
print("Masukkan angka 0 sampai 12.")
if name == "main":
program_utama()
<,
<=,
dan >
agar tidak dianggap sebagai tag HTML.
Ketika ditampilkan di browser, kode tersebut akan tampil sebagai
<,
<=,
dan >.
10. Cara Menjalankan di Thonny
- Buka Thonny.
- Pilih File → New.
- Salin kode Python secara lengkap.
- Tempelkan ke editor Thonny.
- Simpan sebagai
P9_Struktur_Data_Kelompok.py. - Tekan tombol Run atau F5.
- Periksa menu yang tampil pada Shell.
11. Cara Menjalankan di Pydroid 3
- Buka Pydroid 3.
- Buat file Python baru.
- Salin seluruh program.
- Tempelkan ke editor.
- Simpan sebagai
P9_Struktur_Data_Kelompok.py. - Tekan tombol Run.
- Program akan menampilkan menu.
collections.
12. Skenario Pengujian
| No. | Skenario | Input | Hasil yang Diharapkan |
|---|---|---|---|
| 1 | Mencari produk valid | PRD002 | Mouse Wireless ditemukan |
| 2 | Mencari produk tidak tersedia | PRD999 | Produk tidak ditemukan |
| 3 | Pesanan valid | ORD001, PRD002, 2 | Pesanan masuk antrean |
| 4 | Jumlah negatif | -2 | Pesanan ditolak |
| 5 | Jumlah bukan angka | dua | Program meminta input ulang |
| 6 | Jumlah melebihi stok | 100 | Pesanan ditolak |
| 7 | Nomor pesanan ganda | ORD001 | Pesanan ditolak |
| 8 | Memproses antrean | ORD001 lalu ORD002 | ORD001 diproses terlebih dahulu |
| 9 | Antrean kosong | Tidak ada pesanan | Pesan antrean kosong ditampilkan |
| 10 | Sorting harga | Menu 3 | Flashdisk 64 GB berada di posisi pertama |
13. Kesalahan Python yang Sering Terjadi
| Error | Penyebab | Solusi |
|---|---|---|
| SyntaxError | Kesalahan sintaks Python | Periksa baris yang ditunjukkan Python |
| IndentationError | Indentasi tidak konsisten | Gunakan empat spasi |
| KeyError | Key dictionary salah | Periksa nama key |
| ValueError | Input bukan angka | Gunakan validasi input |
| Produk tidak ditemukan | Kode produk salah | Gunakan kode produk yang tersedia |
14. Tugas Pengembangan
Setelah program utama berhasil dijalankan, pilih minimal tiga pengembangan berikut:
- Tambahkan lima produk baru.
- Buat pencarian berdasarkan sebagian nama.
- Buat filter berdasarkan kategori.
- Tambahkan sistem diskon.
- Tambahkan biaya pengiriman.
- Buat fitur pembatalan pesanan.
- Tampilkan tiga produk dengan stok paling sedikit.
- Buat laporan total nilai persediaan.
- Simpan laporan transaksi ke file teks.
- Tambahkan nama pelanggan menggunakan data simulasi.
15. Target Keberhasilan
- Program dapat dijalankan tanpa SyntaxError.
- List dan dictionary digunakan dengan benar.
- Stack dapat didemonstrasikan.
- Queue dapat didemonstrasikan.
- Searching berhasil menemukan data.
- Sorting menghasilkan urutan yang benar.
- Validasi input bekerja.
- Minimal lima skenario pengujian berhasil.
- Program dapat dijalankan di Thonny atau Pydroid 3.
- Setiap anggota mampu menjelaskan bagian kode yang dikerjakan.
16. Bukti Praktik yang Dikumpulkan
Bukti Individual
- Catatan materi.
- Pseudocode.
- Trace table.
- Tabel pengujian.
- Refleksi.
Bukti Kelompok
- File Python.
- Screenshot program di Thonny.
- Screenshot program di Pydroid 3.
- Tabel pengujian.
- Catatan bug dan perbaikan.
- Pembagian peran kelompok.
- Demonstrasi program.
17. Etika dan Keamanan Data
- Gunakan data produk dan pelanggan simulasi.
- Jangan memasukkan identitas pribadi asli.
- Jangan menyimpan kata sandi dalam kode.
- Validasi data masukan pengguna.
- Jangan mengubah file kelompok lain.
- Gunakan HP sesuai arahan guru.
- Jangan menyalin kode tanpa memahami cara kerjanya.
- Periksa kode yang diperoleh dari kecerdasan artifisial.
18. Refleksi
- Apa perbedaan list dan dictionary?
- Apa perbedaan stack dan queue?
- Mengapa queue menggunakan FIFO?
- Bagaimana linear search bekerja?
- Apa fungsi sorting?
- Apa fungsi
deque? - Apa fungsi
append()? - Apa fungsi
pop()? - Bug apa yang ditemukan kelompok?
- Bagaimana cara memperbaikinya?
19. Kesimpulan
List digunakan untuk menyimpan kumpulan data, sedangkan dictionary digunakan untuk menyimpan pasangan key dan value.
Stack menggunakan prinsip LIFO dan sesuai untuk menyimpan riwayat aktivitas. Queue menggunakan prinsip FIFO dan sesuai untuk sistem antrean.
Searching digunakan untuk menemukan data, sedangkan sorting digunakan untuk mengurutkan data berdasarkan kebutuhan.
Praktik ini membantu siswa memahami proses pengembangan program mulai dari analisis masalah, perancangan algoritma, penulisan kode, pengujian, debugging, dokumentasi, hingga presentasi.
Penggunaan buku, Thonny, dan Pydroid 3 secara bergantian memungkinkan siswa tetap aktif meskipun jumlah komputer terbatas.
FAQ Struktur Data dan Algoritma Python
Apa itu struktur data Python?
Struktur data merupakan cara mengorganisasikan dan menyimpan data agar dapat digunakan dan diproses oleh program.
Apa perbedaan list dan dictionary?
List menggunakan indeks untuk mengakses elemen, sedangkan dictionary menggunakan key untuk mengakses value.
Apa itu stack?
Stack adalah struktur data yang menggunakan prinsip Last In First Out atau LIFO.
Apa itu queue?
Queue adalah struktur data yang menggunakan prinsip First In First Out atau FIFO.
Apa itu linear search?
Linear search adalah metode pencarian yang memeriksa data satu per satu dari awal hingga data ditemukan.
Apa itu sorting?
Sorting adalah proses mengurutkan data berdasarkan kriteria tertentu.
Apakah program dapat dijalankan di Pydroid 3?
Ya. Program menggunakan Python 3 dan modul standar
collections.
Apakah program dapat dijalankan di Thonny?
Ya. Simpan program sebagai file dengan ekstensi .py
lalu jalankan menggunakan tombol Run atau F5.

0 Comments