Lompat ke konten

Tipe dan Struktur Data

Ilmu Komputer A-Level · Topik 10

Pelajaran video untuk topik ini Buka halaman video
17:40

Tipe & Struktur Data

Setiap nilai yang disimpan program memerlukan tipe data—dan memilih yang tepat itu penting. Misalkan Anda menyimpan apakah suatu barang tersedia dalam stok. Anda bisa menulis kata ya…

Narasi bahasa Inggris · Subtitle bahasa Inggris + 中文 disematkan langsung

10.1

Memilih jenis data

Silabus
Kandidat harus mampu: Catatan dan panduan
Pilih dan gunakan tipe data yang sesuai untuk solusi masalah termasuk integer, real, char, string, Boolean, date (pseudocode akan menggunakan tipe data berikut: INTEGER, REAL, CHAR, STRING, BOOLEAN, DATE, ARRAY, FILE)
Tunjukkan pemahaman tentang tujuan struktur record untuk menyimpan sekumpulan data dengan tipe data berbeda di bawah satu pengenal Tulis pseudocode untuk mendefinisikan struktur record
Tulis pseudocode untuk membaca data dari struktur record dan menyimpan data ke struktur record

Sumber: Silabus Cambridge International

Setiap pembolehubah memerlukan jenis data — jenis nilai yang dipegangnya dan operasi yang dibenarkan:

  • INTEGER — nombor bulat (42, -7). Untuk kiraan, indeks, ID.
  • REAL — nombor dengan bahagian pecahan (3.14). Untuk wang, ukuran.
  • STRING — watak dalam petikan ("Hello"). Untuk teks.
  • CHAR — satu watak tunggal ('A').
  • BOOLEAN — TRUE atau FALSE. Untuk flag.
  • DATE — tarikh kalendar.

Pilih jenis yang paling tepat dan kecil yang sesuai: INTEGER untuk kiraan bulat, BOOLEAN untuk flag (bukan string "yes"/"no").

Jadual "berikan jenis data yang sesuai" ditentukan oleh bagaimana nilai digunakan: purata markah kelas ialah REAL (ia mempunyai bahagian pecahan); alamat emel ialah STRING; bilangan pelajar ialah INTEGER; sama ada pelajar telah membayar ialah BOOLEAN; tarikh lahir ialah DATE; indeks array sentiasa INTEGER; satu huruf gred ialah CHAR; nombor telefon ialah satu STRING, kerana ia bermula dengan 0 dan tidak pernah digunakan dalam aritmetik. Satu BOOLEAN digunakan untuk flag dengan hanya dua keadaan: sama ada carian telah menemui targetnya, sama ada ahli telah membayar, sama ada kerusi ditempah. Untuk jadual pengenal pasti, nama pembolehubah mesti bermakna juga: NumberOfPeople, bukan n.

Kosa kata Latih
English Bahasa Indonesia
array/əˈreɪ/ array
10.1

Rekod

Satu rekod (struktur rekod) memegang beberapa medan dengan jenis berbeza di bawah satu nama — berguna apabila beberapa nilai menggambarkan sesuatu.

TYPE TStockItem
    DECLARE ItemID : INTEGER
    DECLARE Category : STRING
    DECLARE ItemCost : REAL
    DECLARE InStock : BOOLEAN
ENDTYPE

Ini mentakrifkan jenis TStockItem; nyatakan pembolehubah daripadanya:

DECLARE Item1 : TStockItem
DECLARE Items : ARRAY[1:100] OF TStockItem

Gunakan notasi titik untuk mencapai setiap medan:

Item1.Category ← "Fruit"
OUTPUT Item1.Category, " costs ", Item1.ItemCost

Gunakan record ketika nilai selalu bersama (pelanggan, item stok); gunakan variabel terpisah untuk nilai yang tidak terkait.

Contoh terpecahkan. Sebuah klub menyimpan, untuk setiap siswa, ID siswa (string), nama, tanggal lahir, dan hingga tiga nomor klub (integer). Tulis pseudocode untuk mendeklarasikan tipe record, array untuk menampung $3000$ siswa, dan pernyataan yang menyimpan nama di elemen pertama.

TYPE Student
    DECLARE StudentID : STRING
    DECLARE Name : STRING
    DECLARE DateOfBirth : DATE
    DECLARE Club : ARRAY[1:3] OF INTEGER
ENDTYPE

DECLARE Membership : ARRAY[1:3000] OF Student
Membership[1].Name ← "Li Wei"

Nilai: TYPE dengan pengenal dan ENDTYPE; setiap field dideklarasikan dengan tipe yang sesuai; array dideklarasikan dengan batasnya dan OF Student; field dicapai dengan indeks dan titik. Pertanyaan "nyatakan kesalahan dalam deklarasi record" biasanya menunjuk pada missing ENDTYPE, field tanpa tipe, atau field yang dideklarasikan sebagai STRING yang harus menampung aritmatika. Dua konvensi mendapat nilai sendiri: elemen yang tidak digunakan ditandai dengan nilai yang tidak mungkin menjadi data asli (string kosong, -1, ID 0), dan praktik baik adalah menggunakan marker yang sama di mana saja agar setiap modul dapat mengenali slot yang tidak digunakan; field klub yang tidak digunakan adalah 0. Manfaat array dari record, untuk "nyatakan tiga manfaat": semua data satu entitas disimpan di bawah satu pengenal; field dapat memiliki tipe data berbeda; satu array menggantikan beberapa array paralel yang harus dijaga kesesuaiannya; seluruh set dapat diproses oleh satu loop atau dilewatkan sebagai satu parameter; dan menambahkan field hanya mengubah definisi tipe. Untuk satu pelanggan, struktur yang sesuai adalah record (field dengan tipe berbeda di bawah satu nama); untuk semua pelanggan adalah array dari record.

Rekam TStockItem digambarkan sebagai tumpukan empat bidang di bawah satu nama — ItemID (INTEGER), Category (STRING), ItemCost (REAL), InStock (BOOLEAN) — dicapai dengan notasi titik seperti Item1.Category
Sebuah rekam menyimpan beberapa bidang dengan jenis berbeda di bawah satu nama
Jelajahi

Sebuah rekompokan bidang-bidang di bawah satu nama

Sebuah rekombinasi bidang-bidang yang terkait bersama. Setiap bidang adalah label bernama yang Anda akses dengan notasi titik — Item1.Kategori — bukan melalui indeks numerik.

Kosa kata Latih
English Bahasa Indonesia
record/ˈrekɔːd/ rekaman
record structure/ˈrekɔːd ˈstrʌktʃə/ struktur rekaman
field/fiːld/ medan
element/ˈelɪmənt/ unsur
10.2

Array

Silabus
Kandidat harus mampu: Catatan dan panduan
Gunakan istilah teknis yang berkaitan dengan array Termasuk indeks, batas atas dan batas bawah
Pilih struktur data yang sesuai (array 1D atau array 2D) untuk digunakan dalam tugas tertentu
Tulis pseudocode untuk array 1D dan 2D
Tulis pseudocode untuk memproses data array Urutkan menggunakan bubble sort Cari menggunakan linear search

Sumber: Silabus Cambridge International

Sebuah array adalah kumpulan items yang teratur dari tipe yang sama, di bawah satu nama, dicapai melalui indeks.

  • elemen — satu item dalam array.
  • batas — indeks valid terendah dan tertinggi.
  • dimensi — 1-D (daftar), 2-D (tabel), dll.
  • batas bawah dan batas atas — indeks valid pertama dan terakhir; jumlah elemen adalah batas atas dikurangi batas bawah ditambah satu, dan untuk array 2-D adalah hasil kali kedua jumlah tersebut.

Jadi dalam ThisArray[n] ← 42 array memiliki satu dimensi, indeks adalah variabel n (sebuah INTEGER), dan elemen pada indeks itu menerima 42. Sebelum array dapat dideklarasikan Anda perlu tipe data-nya serta batasnya. Untuk mendeklarasikan $120$ nilai yang mungkin mencakup desimal: DECLARE Data : ARRAY[1:120] OF REAL; tabel string $150$-baris, dua-kolom: DECLARE Data : ARRAY[1:150, 1:2] OF STRING, yang memiliki $300$ elemen. Manfaat array dibandingkan variabel terpisah, untuk menjelaskan bernilai dua: satu pengenal daripada tiga puluh; elemen dapat diproses oleh loop dengan indeks sebagai counter; ukuran mudah diubah; dan seluruh set dapat dilewatkan ke modul sebagai satu parameter. Array juga dapat menggantikan rantai pernyataan seleksi: DaysInMonth[Month] melihat jawaban langsung alih-alih十二个 IF klausa, yang lebih pendek, lebih cepat ditulis, dan lebih mudah dirawat.

Array 1-D

DECLARE Names : ARRAY[1:5] OF STRING
Names[3] ← "Cara"
OUTPUT Names[3]

Proses setiap elemen dengan loop FOR:

FOR i ← 1 TO 5
    OUTPUT Names[i]
NEXT i
A row of indexed cells named myList, with indices 0 to 8 and the lower bound (first index) and upper bound (last index) marked
A 1-D array (a list) with indices and bounds

Array 2-D (array 2D)

DECLARE Grid : ARRAY[1:3, 1:4] OF INTEGER
Grid[2, 3] ← 99

Indeks pertama adalah baris, kedua adalah kolom. Gunakan loop bersarang untuk mengunjungi setiap sel. Gunakan 1-D untuk satu urutan tunggal, 2-D untuk dua dimensi alami (grid, baris × kolom).

Grid 3 oleh 4 dengan indeks baris dan kolom; sel pada baris 2, kolom 3 disoroti
Array 2-D (tabel) dengan indeks baris dan kolom

Operasi umum

Sebuah pencarian linear memeriksa setiap elemen hingga ditemukan:

FOR i ← 1 TO n
    IF A[i] = Target THEN
        OUTPUT "Found at ", i
    ENDIF
NEXT i

Untuk menemukan jumlah, hitungan, maksimum, atau minimum, atur variabel berjalan lalu sikat melintasinya:

Max ← A[1]
FOR i ← 2 TO n
    IF A[i] > Max THEN
        Max ← A[i]
    ENDIF
NEXT i

Sebuah bubble sort mengurutkan array: lewati membandingkan setiap pasangan bersebelahan dan menukar apa pun yang tidak sesuai urutan; ulangi lewatan hingga satu lewatan tidak melakukan penukaran.

Ujian Paper 2 meminta algoritma ini baik sebagai pseudocode maupun sebagai langkah-langkah dalam kata-kata, dan terkadang dalam bentuk "efisien" mereka:

  • Nilai terbesar: atur Largest ke elemen pertama; untuk setiap elemen tersisa, jika lebih besar dari Largest, simpan dalam Largest; setelah loop output Largest. Untuk posisi terbesar, simpan variabel kedua yang menyimpan indeks setiap kali Largest berubah.
  • Pencarian linear mengembalikan posisi: atur FoundAt ← -1 sebelum loop (nilai yang tidak pernah bisa menjadi indeks valid, sehingga berarti "tidak ditemukan"); loop melintasi array; ketika elemen cocok, simpan indeks dan tinggalkan loop; setelah loop uji FoundAt.
  • Hitung atau output elemen non-blank: bandingkan setiap elemen dengan marker elemen tidak digunakan ("" atau -1) dan hitung atau output hanya yang berbeda.
  • Hapus item: temukan indeksnya dengan pencarian linear; geser setiap elemen berikutnya satu tempat menuju awal, sehingga celah tertutup; tandai elemen terakhir sebagai tidak digunakan (atau kurangi hitungan).
  • Sisipkan ke array terurut: temukan indeks pertama yang elemennya lebih besar; geser elemen itu dan setiap elemen berikutnya satu tempat menuju akhir; simpan nilai baru di celah.
  • Bubble sort efisien: flag Swapped agar lewatan berhenti segera setelah lewatan tidak melakukan penukaran, dan batas atas yang turun satu setiap lewatan karena nilai terbesar telah mencapai ujung.
REPEAT
    Swapped ← FALSE
    FOR Index ← 1 TO Limit - 1
        IF Data[Index] > Data[Index + 1] THEN
            Temp ← Data[Index]
            Data[Index] ← Data[Index + 1]
            Data[Index + 1] ← Temp
            Swapped ← TRUE
        ENDIF
    NEXT Index
    Limit ← Limit - 1
UNTIL Swapped = FALSE

Nilai diberikan untuk loop luar yang berulang hingga tidak ada lagi pertukaran, penanda yang diatur di dalam IF, tiga baris pertukaran dengan variabel sementara, dan batas yang menyusut. Pengurutan dalam "langkah" (penyempurnaan bertahap) adalah: ulangi hingga terurut; pada setiap kali lewat bandingkan pasangan bersebelahan; tukar pasangan yang tidak sesuai urutan; setelah setiap kali lewat nilai terbesar yang belum terurut berada di posisi terakhir. Dua array 1-D berisi rekaman atau data paralel diproses dengan satu loop dan satu indeks; array 2-D memerlukan loop bersarang, loop luar untuk baris dan loop dalam untuk kolom, dan pencarian di satu baris menetapkan indeks baris dan melakukan loop melalui kolom.

Satu kali lewat pengurutan gelembung atas 5, 2, 8, 1: bandingkan 5 dan 2 lalu tukar menjadi 2, 5, 8, 1; bandingkan 5 dan 8 (sudah sesuai urutan); bandingkan 8 dan 1 lalu tukar menjadi 2, 5, 1, 8, sehingga nilai terbesar 8 mencapai posisi akhir
Satu kali lewat pengurutan gelembung: pasangan bersebelahan dibandingkan dan ditukar, mendorong nilai terbesar ke posisi akhir
Jelajahi

Array 2-D

Pilih baris dan kolom untuk membaca satu elemen — bagaimana grid data disimpan dan diindeks.

Kosa kata Latih
English Bahasa Indonesia
index/ˈɪndeks/ indeks
bounds/baʊndz/ batas
lower bound/ˈləʊə baʊnd/ batas bawah
upper bound/ˈʌpə baʊnd/ batas atas
bubble sort/ˈbʌbl sɔːt/ bubble sort
10.3

Berkas

Silabus
Kandidat harus mampu: Catatan dan panduan
Tunjukkan pemahaman mengapa file diperlukan
Tulis pseudocode untuk menangani file teks yang terdiri dari satu atau lebih baris

Sumber: Silabus Cambridge International

Sebuah berkas adalah data yang disimpan pada penyimpanan sekunder, tersimpan antar jalannya program. Variabel di RAM hilang saat program berakhir, jadi untuk menyimpan data secara permanen (skor tertinggi, catatan, pengaturan), program menulis ke sebuah berkas. Berkas juga memungkinkan program berbagi data dan memulai ulang dari keadaan yang tersimpan.

Variabel di RAM hilang saat program berakhir, tetapi berkas di disk tersimpan antar jalannya, sehingga program menyimpan ke dalamnya dan memuat darinya *Variabel di RAM lenyap saat program berakhir; berkas di disk bertahan antar jalannya

Sebuah berkas teks berisi satu atau lebih baris karakter yang dapat dibaca; program membaca dan menulis berkas teks per baris. Buka berkas sebelum digunakan dan tutup setelahnya:

OPENFILE "data.txt" FOR READ      // or FOR WRITE, FOR APPEND
WHILE NOT EOF("data.txt") DO
    READFILE "data.txt", LineString
    OUTPUT LineString
ENDWHILE
CLOSEFILE "data.txt"

EOF menguji akhir berkas sebelum membaca. Untuk menulis:

OPENFILE "log.txt" FOR WRITE
FOR i ← 1 TO 100
    WRITEFILE "log.txt", "Event " & i
NEXT i
CLOSEFILE "log.txt"

Selalu tutup setiap berkas—jika tidak, penulisan yang terbuffer mungkin hilang dan program lain mungkin terkunci.

Mengapa berkas (dua nilai): data tersimpan setelah program berakhir, sehingga tersedia saat program dijalankan berikutnya; dapat dibagikan dengan program lain; dan dapat menampung lebih banyak daripada muatan memori. Ciri khas berkas teks yang memungkinkan program memprosesnya adalah bahwa berkas tersebut merupakan sekuens baris, dibaca satu per satu dari awal. Tiga mode: READ untuk membaca dari awal; WRITE untuk membuat berkas baru, yang menghapus semua isi yang ada, sehingga tidak dapat digunakan untuk menambahkan ke berkas; APPEND untuk menambahkan baris di akhir berkas yang sudah ada. Uji EOF sebelum setiap pembacaan, dan buka berkas hanya sekali, bahkan ketika beberapa modul menggunakannya.

Contoh pengerjaan. Tulis pseudokode untuk prosedur LastLines(FileName : STRING) yang menampilkan tiga baris terakhir dari sebuah berkas teks, dalam urutan.

PROCEDURE LastLines(BYVAL FileName : STRING)
    DECLARE LineX, LineY, LineZ : STRING
    LineX ← ""
    LineY ← ""
    LineZ ← ""
    OPENFILE FileName FOR READ
    WHILE NOT EOF(FileName) DO
        LineX ← LineY
        LineY ← LineZ
        READFILE FileName, LineZ
    ENDWHILE
    CLOSEFILE FileName
    OUTPUT LineX
    OUTPUT LineY
    OUTPUT LineZ
ENDPROCEDURE

Setiap baris baru mendorong tiga baris sebelumnya, sehingga saat berkas berakhir, tiga variabel memegang tiga baris terakhirnya; berkas dengan baris kurang akan menampilkan string kosong. Untuk menampilkan lima baris pertama, hitung jumlah baris yang dibaca dan hentikan loop pada lima atau pada EOF, mana yang terjadi lebih dulu; berkas yang kosong dideteksi oleh EOF sebagai TRUE segera setelah dibuka.

Bidang dalam baris. Sebuah berkas teks berisi string, jadi rekaman ditulis sebagai satu baris dengan bidangnya digabungkan oleh karakter pemisah, dan setiap angka atau Boolean dikonversi dengan NUM_TO_STR (dan dibaca kembali dengan STR_TO_NUM, atau dengan membandingkan dengan "TRUE"). Pilih pemisah yang tidak pernah muncul dalam data: koma atau | untuk nama dan angka, jangan gunakan spasi ketika nama mungkin mengandung spasi. Jika suatu bidang dapat berisi karakter apa pun, pemisah dapat tertukar dengan data; solusinya adalah meletakkan setiap bidang di barisnya sendiri, atau menulis panjang bidang sebelum isinya. Satu item per baris mudah dibaca kembali tetapi memakan lebih banyak baris dan membuat rekaman sulit terlihat sebagai satu kesatuan. Membaca berkas yang barisnya memiliki urutan yang diketahui (naik berdasarkan ID) memungkinkan pencarian berhenti segera setelah ID yang lebih besar dibaca, alih-alih membaca sampai akhir. Berkas simpan yang dibuat setiap kali permainan disimpan memerlukan nama berkas yang bermakna, misalnya nama pemain dan tanggal serta waktu, sehingga simpanan sebelumnya dapat dikembalikan.

Satu baris berkas teks, 1023,Ali,12.50,TRUE, dibagi pada pemisah koma menjadi empat bidang rekaman item saham, dengan konversi yang dibutuhkan setiap bidang: STR_TO_NUM untuk bidang angka, string sebagaimana adanya, dan perbandingan dengan TRUE untuk Boolean *Satu baris berkas teks adalah satu rekaman: bidang-bidang digabungkan oleh pemisah, dikonversi ke jenisnya saat dibaca kembali

Jelajahi

Menangani file: buka → gunakan → tutup

Ikuti siklus hidup setiap file. Dua bagian yang mudah dilupakan adalah menguji EOF saat membaca dalam loop, dan selalu menutup di akhir.

Kosa kata Latih
English Bahasa Indonesia
file/faɪl/ file
secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ penyimpanan sekunder
10.4

Tipe Data Abstrak (ADT)

Silabus
Kandidat harus mampu: Catatan dan panduan
Tunjukkan pemahaman bahwa ADT adalah kumpulan data dan serangkaian operasi pada data tersebut
Tunjukkan pemahaman bahwa stack, queue, dan linked list adalah contoh ADT Jelaskan fitur utama stack, queue, dan linked list serta justifikasi penggunaannya untuk situasi tertentu
Gunakan stack, queue, dan linked list untuk menyimpan data Kandidat tidak diminta menulis pseudocode untuk struktur ini, tetapi mereka harus mampu menambahkan, mengedit, dan menghapus data dari struktur ini
Jelaskan bagaimana queue, stack, dan linked list dapat diimplementasikan menggunakan array

Sumber: Silabus Cambridge International

*Daftar terhubung: sisipkan dengan menyambungkan ulang pointer

*Tumpukan vs antrean: LIFO dan FIFO

Sebuah Tipe Data Abstrak (ADT) adalah kumpulan data beserta operasi di atasnya, didefinisikan oleh apa yang dilakukannya, bukan bagaimana cara menyimpannya. Pengguna hanya bekerja melalui operasi; implementasinya disembunyikan, sehingga dapat berubah tanpa mempengaruhi kode yang menggunakan ADT. Hafal tiga: tumpukan, antrean, daftar terhubung.

Definisi satu nilai: ADT adalah kumpulan data bersama dengan set operasi pada data tersebut. Tumpukan, antrean, daftar terhubung, pohon biner, dan array semuanya adalah ADT. Untuk membenarkan pilihan: antrean ketika item harus ditangani dalam urutan kedatangannya (pekerjaan cetak, penekanan tombol, pelanggan di toko), karena sifat first in, first out; tumpukan ketika item terbaru harus ditangani pertama (undo, menjelajahi halaman web kembali, membalikkan urutan, alamat return dari pemanggilan bersarang), karena sifat last in, first out; daftar terhubung ketika item disisipkan dan dihapus di tengah urutan yang sering terjadi, karena hanya pointer yang berubah dan tidak ada yang perlu digeser. Untuk membandingkan tumpukan dan antrean: keduanya adalah struktur linear dari item dengan urutan, keduanya diimplementasikan dengan array dan pointer, dan keduanya memerlukan pengecekan penuh sebelum menambahkan dan kosong sebelum menghapus; tumpukan memiliki satu pointer dan menambahkan serta menghapus di ujung yang sama, antrean memiliki dua pointer dan menambahkan di satu ujung serta menghapus di ujung lainnya.

Tumpukan

Sebuah tumpukan bekerja dalam urutan LIFO (Last In, First Out). Operasi: push (tambahkan ke atas), pop (hapus dari atas), peek (lihat bagian atas), dan tes untuk kosong/penuh. Kegunaan: riwayat undo, alamat return pemanggilan fungsi, parsing ekspresi, backtracking.

Tumpukan yang disimpan dalam array ditampilkan dalam tiga keadaan; pointer Top bergerak naik setelah push dan turun setelah pop, sementara dasar tumpukan tetap tetap
Push dan pop mengubah pointer top; pointer base tetap diam

Contoh terpecahkan. Sebuah tumpukan karakter menyimpan, dari bawah, 'P', 'N', 'Z', 'X', 'Y', 'W', dengan pointer top-of-stack di 'W' (lokasi memori 202 dari 200–207). Operasi POP, POP, PUSH 'A', PUSH 'B', POP dilakukan. Apa yang ada di tumpukan, dan ke mana pointer menunjuk?

Dua pops menghapus 'W' kemudian 'Y'; pushes menambahkan 'A' kemudian 'B' menggantinya; pop terakhir menghapus 'B'. Stack sekarang berisi 'P', 'N', 'Z', 'X', 'A' dan pointer berada di 'A', lokasi 203. Nilai yang telah berada di stack paling lama adalah item terendah, 'P'; maksimal lima pops tambahan mungkin dilakukan sebelum stack kosong, dan pop pada stack kosong adalah kesalahan, oleh karena itu Pop() memeriksa apakah kosong terlebih dahulu. Fungsi Push() yang mengembalikan TRUE jika berhasil pertama-tama memeriksa apakah pointer berada di bagian atas array (penuh) dan mengembalikan FALSE jika ya. Elemen array tidak perlu diinisialisasi sebelum digunakan, karena pointer saja menunjukkan elemen mana yang sedang digunakan.

Tumpukan buku tinggi yang tersusun rata di atas satu sama lain
Tumpukan buku adalah tumpukan yang bisa Anda lihat. Anda hanya bisa menambah atau mengambil buku dari atas, jadi yang terakhir Anda taruh adalah yang pertama Anda ambil — itu persis LIFO

Antrean

Sebuah antrean bekerja dalam urutan FIFO (First In, First Out). Operasi: enqueue (tambahkan ke belakang), dequeue (hapus dari depan), dan tes untuk kosong/penuh. Kegunaan: spooling pencetakan, penjadwalan, pencarian breadth-first, buffering.

Antrian linear yang disimpan dalam array ditampilkan dalam tiga kondisi; enqueue memajukan pointer Rear dan dequeue memajukan pointer Front, meninggalkan sel awal kosong dan terbuang
Enqueue menambahkan di belakang; dequeue menghapus dari depan

Untuk mendeskripsikan penambahan item: periksa bahwa antrean tidak penuh; simpan item di posisi yang diberikan oleh pointer akhir-antrean; tingkatkan pointer akhir (dan hitung). Untuk mendeskripsikan penghapusan: periksa bahwa antrean tidak kosong; baca item di pointer depan; tingkatkan pointer depan (dan kurangi hitung). Nyatakan konvensi yang Anda gunakan: jika pointer akhir menandai ruang bebas berikutnya, front dan end pointer yang sama berarti antrean kosong; jika menandai item terakhir, pointer yang sama berarti satu item. Dalam antrean linear, pointer depan hanya pernah bergerak maju, sehingga sel di belakangnya terbuang; itulah yang diperbaiki oleh antrean melingkar di bawah ini. Dua fitur antrean untuk dinyatakan: item ditambahkan di belakang dan dihapus dari depan, sehingga item pertama yang ditambahkan adalah yang pertama dihapus.

Garis orang yang sangat panjang menunggu satu di belakang lainnya, membentang sepanjang dinding ke kejauhan
Barisan orang adalah antrean yang bisa Anda lihat. Anda bergabung di belakang dan dilayani dari depan, jadi siapa pun yang menunggu paling lama akan dilayani pertama — itu persis FIFO

Daftar terhubung

Sebuah daftar terhubung menyimpan data sebagai sequence dari node. Setiap node memegang nilai dan pointer ke node berikutnya; pointer head menandai awal, dan pointer node terakhir adalah sentinel (mis. NULL). Operasi: insert, delete, search, dan traverse ( kunjungi setiap node secara berurutan). Keunggulannya dibandingkan array adalah inserci/deletion murah (cukup sesuaikan pointer); kekurangannya adalah akses acak lambat (Anda harus mengikuti pointer dari head).

Empat node dalam barisan, masing-masing menyimpan nilai dan bidang penunjuk next; head pointer menunjuk ke node pertama dan penunjuk node terakhir adalah NULL
Daftar terhubung: setiap node menunjuk ke yang berikutnya

Menyisipkan node secara berurutan (empat poin): telusuri daftar dari kepala, mengikuti pointer, hingga node sebelum posisi ditemukan (node terakhir yang nilainya lebih kecil); ambil node bebas dan simpan nilai baru di dalamnya; atur pointer node baru ke alamat yang ditunjuk oleh node sebelumnya; atur pointer node sebelumnya ke node baru. Jika nilai baru harus berada di depan, pointer kepala diubah sebagai gantinya. Menghapus node: cari node sebelumnya, lalu atur pointer node tersebut ke alamat yang ditunjuk oleh node yang dihapus, sehingga daftar melewatinya; node yang dibebaskan kembali ke daftar bebas. Dibandingkan dengan array 1-D, menyisipkan atau menghapus pada linked list tidak memerlukan pergeseran item lainnya, dan daftar dapat tumbuh hingga memori habis; biayanya adalah pointer tambahan yang disimpan bersama setiap item, serta fakta bahwa mengakses item ke-$n$ berarti mengikuti $n$ pointer, karena tidak ada indeks langsung.

Jelajahi

Daftar terhubung (*linked list*): node-node yang dihubungkan oleh pointer

Setiap node menyimpan nilai dan pointer ke node berikutnya. Menyisipkan atau menghapus hanya menghubungkan ulang pointer — tidak ada item bergeser, berbeda dengan array.

Jelajahi

Tumpukan dan antrean

Push dan pop. Stack adalah terakhir masuk pertama keluar; queue adalah pertama masuk pertama keluar — dua ADT utama.

Kosa kata Latih
English Bahasa Indonesia
stack/stæk/ tumpukan
dimension/daɪˈmenʃn/ dimensi
push/pʊʃ/ dorong
separator/ˈsepəreɪtə/ pemisah
linked list/lɪŋkt lɪst/ daftar linked
pointer/ˈpɔɪntə/ pointer
queue/kjuː/ antrean
LIFO/ˈlaɪfəʊ/ LIFO
FIFO/ˈfaɪfəʊ/ FIFO
pop/pɒp/ pop
enqueue/enˈkjuː/ enqueue
dequeue/diːˈkjuː/ dequeue
node/nəʊd/ simpul
traverse/trəˈvɜːs/ traversing
10.4

Mengimplementasikan ADT menggunakan array

Stack menggunakan array

Simpan item dalam Stack[1:MaxSize] dengan integer Top (0 saat kosong).

  • Push(x): jika Top = MaxSize stack penuh (overflow); selain itu Top ← Top + 1; Stack[Top] ← x.
  • Pop(): jika Top = 0 maka stack kosong (underflow); sebaliknya kembalikan Stack[Top] dan Top ← Top - 1.

Queue menggunakan array melingkar

Queue sederhana memungkinkan Front dan Rear berjalan melewati akhir, memboroskan bagian awal. Solusinya adalah array melingkar — ketika pointer mencapai MaxSize ia akan melingkari kembali ke 1:

  • Enqueue(x): cek penuh; selain itu Rear ← (Rear MOD MaxSize) + 1; Queue[Rear] ← x.
  • Dequeue(): cek kosong; selain itu kembalikan Queue[Front] dan Front ← (Front MOD MaxSize) + 1.

Lacak hitungan terpisah untuk membedakan antara kosong dan penuh.

Algoritma untuk pointer akhir, dalam kata-kata: jika hitungan sama dengan ukuran, laporkan bahwa queue penuh dan hentikan; selain itu tambahkan satu pada pointer akhir; jika sekarang melebihi indeks terakhir, tetapkan ke indeks pertama; simpan item di sana dan tambahkan satu pada hitungan. Deklarasi yang diperlukan untuk jawaban "deskripsikan deklarasinya dan inisialisasinya" bernilai lima poin: array dengan ukurannya dan tipe elemennya; pointer front dan pointer end, keduanya diinisialisasi ke indeks pertama (atau front ke indeks pertama dan end ke ruang bebas berikutnya); dan hitungan item, diinisialisasi ke $0$.

Sebagai contoh, dengan MaxSize = 6: jika Rear = 5, maka (5 MOD 6) + 1 = 6, sehingga item berikutnya masuk ke sel 6; jika Rear = 6, maka (6 MOD 6) + 1 = 1, sehingga pointer berlingkari kembali ke sel 1.

Antrian melingkar yang disimpan dalam array; sel terisi melingkari melewati sel terakhir kembali ke awal, dengan panah melengkung yang menunjukkan pointer melingkari dari indeks terakhir ke sel 1
Antrian melingkar melingkari pointer kembali ke awal array

Linked list menggunakan array

Gunakan array dari record, masing-masing memiliki Next indeks:

TYPE TNode
    DECLARE Value : INTEGER
    DECLARE Next : INTEGER     // index of the next node, or -1 for end
ENDTYPE

DECLARE Nodes : ARRAY[1:MaxSize] OF TNode
DECLARE Head : INTEGER         // index of first node, -1 if empty
DECLARE FreeListHead : INTEGER // first available free node

Daftar bebas merantai slot yang tidak terpakai, sama seperti daftar data merantai slot yang digunakan. Untuk menyisipkan: ambil slot dari FreeListHead, atur nilai dan Next node baru, dan perbarui Next node sebelumnya (atau Head). Untuk menghapus: putuskan rantai node dan kembalikan slotnya ke daftar bebas. Ini memberikan fleksibilitas struktur linked dengan alokasi statis array.

Array Nilai dan array Next paralel yang mengimplementasikan linked list; pointer Head merantai node yang digunakan dan pointer FreeListHead merantai slot bebas, masing-masing berakhir dengan Next = -1
Linked list yang disimpan dalam array: array data dan array pointer

Contoh terpecahkan. Daftar terhubung disimpan dalam array Data dan array Pointer, dengan Start menunjuk ke indeks 1. Daftar tersebut adalah 1 → 3 → 4 (indeks 1 berisi D40, indeks 3 berisi D32, indeks 4 berisi D11, pointer-nya adalah $\emptyset$); daftar bebas dimulai dari indeks 2 dan berlanjut 2 → 5. Masukkan D6 di antara D32 dan D11.

Ambil node bebas pertama, indeks 2, dan atur FreeStart ke pointer-nya, yaitu 5; simpan D6 dalam Data[2]; atur Pointer[2] ke nilai Pointer[3] yang dipegang, yaitu 4; atur Pointer[3] menjadi 2. List membaca 1 → 3 → 2 → 4 dan free list adalah 5 → $\emptyset$. Jawaban untuk "bagaimana linked list dapat diimplementasikan" adalah tepat bagian-bagian ini: array (atau array dari record) untuk data, array paralel untuk pointer yang memegang indeks, pointer mulai, pointer daftar bebas, dan nilai null seperti $-1$ untuk akhir.

Contoh terpecahkan. Antrian melingkar disimpan dalam array berukuran 5 (indeks 0 hingga 4) dengan Front = 3, Rear = 3, dan satu item tersimpan. Dua item ditambahkan, lalu dua item dihapus. Di mana letak pointer-nya, dan mengapa menggunakan antrian melingkar sama sekali? Setiap perpindahan menggunakan (pointer + 1) MOD size, sehingga pointer berlipat. Menambahkan dua kali memindahkan Rear: $3 \rightarrow 4$, kemudian $4 \rightarrow 0$ (karena $(4+1) \bmod 5 = 0$), sehingga Rear = 0 dan tiga item tersimpan. Menghapus dua kali memindahkan Front dengan cara yang sama: $3 \rightarrow 4$, kemudian $4 \rightarrow 0$, menyisakan Front = 0 dan satu item. Lipatan adalah inti utamanya: dalam antrian array linear, pointer bergerak menuju akhir dan ruang yang dibebaskan di bagian depan terbuang meskipun antrian kosong. Ingat bahwa antrian menghapus dari Front dan menambahkan di Rear — stack hanya menggunakan satu pointer untuk keduanya.

Jelajahi

Mengimplementasikan ADT dengan array

FIFO

Antrian (queue) bersifat first-in-first-out — enqueue di belakang, dequeue dari depan.

Kosa kata Latih
English Bahasa Indonesia
free list/friː lɪst/ daftar bebas
overflow/ˌəʊvəˈfləʊ/ overflow
underflow/ˌʌndəˈfləʊ/ underflow
circular array/ˈsɜːkjʊlə əˈreɪ/ array melingkar
10.4

Definisi yang diterima oleh penguji

Pertanyaan definisi dinilai berdasarkan kata-kata tetap. Hafalkan ini persis.

Istilah Definisi
record struktur data yang menyimpan sekumpulan item data (bidang) dari berbagai tipe data di bawah satu pengenal
array struktur data yang menyimpan jumlah elemen tetap dari tipe data yang sama di bawah satu pengenal, masing-masing diakses melalui indeks
index angka yang mengidentifikasi satu elemen dari array
upper bound, lower bound indeks terbesar dan terkecil yang valid dari array
text file file yang menyimpan data sebagai baris karakter, yang dibaca dan ditulis program satu baris pada satu waktu
abstract data type kumpulan data bersama dengan serangkaian operasi pada data tersebut
stack daftar di mana item ditambahkan dan dihapus dari ujung yang sama, yaitu atas, sehingga item terakhir yang ditambahkan adalah item pertama yang dihapus (LIFO)
queue daftar di mana item ditambahkan di belakang dan dihapus dari depan, sehingga item pertama yang masuk adalah item pertama yang keluar (FIFO)
linked list daftar di mana setiap node menyimpan item data dan pointer ke node berikutnya, dengan pointer awal ke node pertama
pointer variabel yang menyimpan alamat (atau indeks) dari sebuah node atau posisi dalam struktur
linear search memeriksa setiap elemen secara berurutan dari awal hingga target ditemukan atau akhir tercapai
bubble sort pengulangan melalui array membandingkan pasangan bersebelahan dan menukar yang tidak sesuai urutan, hingga satu kali pengulangan tidak melakukan penukaran
Kosa kata Latih
English Bahasa Indonesia
data type/ˈdeɪtə taɪp/ tipe data
linear search/ˈlɪnɪə sɜːtʃ/ pencarian linear
text file/tekst faɪl/ file teks
end of file/end ɒv faɪl/ akhir file
Abstract Data Type/ˈæbstrækt ˈdeɪtə taɪp/ Tipe Data Abstrak
10.4

Tips ujian

  • Pilih struktur data yang tepat dan berikan alasannya (record untuk bidang campuran, array 2-D untuk grid).
  • Pahami cara mengimplementasikan stack, queue dan linked list menggunakan array dan pointer (top; front/rear; next).
  • Bedakan ADT ( perilakunya ) dari implementasinya (array plus pointer).

Kesalahan umum

  • Deklarasi record tanpa ENDTYPE, atau bidang tanpa tipe. Setiap bidang adalah baris DECLARE dengan sebuah tipe.
  • Membaca melebihi akhir file, atau menulis dengan WRITE ketika file harus mempertahankan isinya. Uji EOF sebelum setiap baca; gunakan APPEND untuk menambahkan.
  • Menulis angka ke file teks tanpa dikonversi. File berisi string: NUM_TO_STR keluar, STR_TO_NUM kembali.
  • Melupakan pengecekan. Push dan enqueue menguji penuh terlebih dahulu; Pop dan dequeue menguji kosong terlebih dahulu, dan jawaban menyatakan hal itu.
  • Kehilangan sisa daftar saat menyisipkan node. Atur pointer node baru ke node next lama sebelum mengubah pointer node sebelumnya.
  • Linear search yang tidak pernah mengatakan "tidak ditemukan". Inisialisasi posisi ke $-1$ dan uji setelah loop.

Pelajaran interaktif untuk topik ini

Kerjakan langkah demi langkah, dengan latihan pengecekan instan.

Soal-Soil Masa Lalu

Topik lain dalam Ilmu Komputer A-Level

Masuk atau buat akun

IGCSE, A-Level & AP