Halaman 1
STRUKTUR DATA
STRUKTUR DATA
Pengajar
Pengajar
Jaidan
Jaidan
Jauhari
Jauhari
, MT
, MT
Alamat
Alamat EmailEmail
Disarikan
Disarikan Dari Dari BerbagaiBerbagaiSumberSumber, , TerutamaTerutama Dari Diktat Dari Diktat StrukturStruktur Data Data InformatikaInformatika ITB
SILABUS MATERI KULIAH
SILABUS MATERI KULIAH
z Pengantar Struktur Data
z Review Record dan Array
z Stack (Tumpukan) z Queue (Antrian)
z Linked List dan Variasi List
z MultiList
z Pohon Biner
Halaman 3
BUKU SUMBER
BUKU SUMBER
1. Inggriani Liem. 1997. Diktat Kuliah Algoritma dan
Pemrograman Prosedural. Bandung : ITB
2. Inggriani Liem. 2003. Diktat Kuliah Struktur Data.
Bandung : ITB
3. Rinaldi Munir. 2003. Algoritma dan Pemrograman II.
Bandung : Penerbit Informatika
4. Bambang Wahyudi. 2004. Struktur Data dan Algoritma.
Yogyakarta : Andi Offset
5. Dwi Sanjaya. 2001. Bertualang dengan Struktur Data di
Planet Pascal. Yogyakarta : JJ Learning
6. P. Insap Santoso.1997. Struktur Data dengan Turbo
Komponen
Komponen PenilaianPenilaian
z Tugas 20%
Halaman 5
Aturan
Aturan
dan
dan
Sanksi
Sanksi
-
-
sanksi
sanksi
z Kehadiran minimal 80%, kurang dari 80% tidak lulus (mendapat nilai E)
z Keterlambatan maksimal 10 menit (Lebih dari 10 menit tidak diijinkan memasuki ruangan)
z Pengumpulan Tugas yang melebihi waktu yang telah ditentukan akan diberikan nilai nol
z Kecurangan dalam bentuk apapun akan mendapatkan nilai E
z Mahasiswa berpakaian rapi dan sopan, yang ditunjukkan antara lain 1. Memakai sepatu tertutup
2. Memakai baju berkerah
3. Tidak memakai aksesoris yang tidak diijinkan
4. Tidak memakai pakaian yang kurang dasar atau lebih dasar 5. dan lain-lain
PENGERTIAN STRUKTUR DATA
PENGERTIAN STRUKTUR DATA
Struktur data adalah cara menyimpan atau
merepresentasikan data di dalam komputer agar bisa dipakai secara efisien
Sedangkan data adalah representasi dari fakta dunia nyata.
Fakta atau keterangan tentang kenyataan yang
Halaman 7
Secara garis besar type data dapat dikategorikan menjadi :
1. Type data sederhana
a. Type data sederhana tunggal, misalnya Integer, real, boolean dan karakter
b. Type data sederhana majemuk, misalnya String
2. Struktur Data, meliputi
b. Struktur data majemuk, yang terdiri dari
Linier : Stack, Queue, serta List dan Multilist
Non Linier : Pohon Biner dan Graph
Halaman 9
Struktur data yang ″standar″ yang biasanya digunakan dibidang informatika adalah :
z List linier (Linked List) dan variasinya
z Multilist
z Stack (Tumpukan)
z Queue (Antrian)
z Tree ( Pohon )
REVIEW RECORD (REKAMAN)
REVIEW RECORD (REKAMAN)
Disusun oleh satu atau lebih field. Tiap field menyimpan data dari tipe dasar tertentu atau dari tipe bentukan lain yang sudah didefinisikan sebelumnya. Nama rekaman ditentukan oleh pemrogram.
Rekaman disebut juga tipe terstruktur.
Contoh :
1. type Titik : record <x : real, y : real>
Halaman 11
2. Didefinisikan tipe terstruktur yang mewakili Jam yang dinyatakan sebagai jam (hh), menit (mm) dan detik (ss), maka cara menulis type Jam adalah :
type JAM : record
<hh : integer, {0…23} mm : integer, {0…59} ss : integer {0…59} >
Jika J adalah peubah (variabel) bertipe Jam
Terjemahan dalam bahasa C :
1. type Titik : record <x : real, y : real> diterjemahkan menjadi :
typedef struct { float x; float y; } Titik; 2. type JAM : record
<hh : integer, {0…23} mm : integer, {0…59} ss : integer {0…59} >
Diterjemahkan menjadi : typedef struct
Halaman 13
REVIEW ARRAY (LARIK)
REVIEW ARRAY (LARIK)
1. Pendahuluan
z Larik adalah struktur data statik yang
menyimpan sekumpulan elemen yang bertipe sama.
z Setiap elemen diakses langsung melalui indeksnya.
z Banyaknya elemen larik harus sudah diketahui sebelum program dieksekusi.
z Tipe elemen larik dapat berupa tipe sederhana, tipe terstruktur atau tipe larik lain.
Halaman 15 Cara Pendefinisian Array
1. Sebagai Peubah Contoh :
L : array[1..50] of integer
NamaMhs : array[‘a’..’j’] of string
2. Sebagai tipe baru
Contoh :
3. Mendefinisikan ukuran maksimum elemen larik sebagai konstanta
Contoh :
Const Nmaks = 100
type Larikint : array[1..Nmaks] of integer P : LarikInt
Cara menterjemahkan ke bahasa C : #define Nmaks 100
Halaman 17
Cara Mengacu Elemen Larik
z Elemen larik diacu melalui indeksnya.
Nilai indek harus terdefinisi.
z Contoh cara mengacu elemen larik adalah :
L[4] {mengacu elemen keempat dari larik L }
NamaMhs[‘b’] {mengacu elemen kedua dari larik NamaMhs}
Menginisialisasi Larik
z menginisialisasi elemen larik adalah memberikan harga awal untuk seluruh elemen larik, misalnya menginisialisasi dengan nilai 0 seperti di bawah ini :
Procedure InisDgn0(output A:larik, input N:integer)
{menginisialisasi setiap elemen larik A[1..N] dengan nol} {K. Awal : N adalah banyak elemen efektif larik,
nilainya terdefinisi}
{K. Akhir : seluruh elemen larik A bernilai nol}
Deklarasi :
K : integer
Deskripsi :
Halaman 19
Mengisi elemen larik dari piranti masukan
z Elemen larik dapat diisi dengan nilai yang dibaca dari piranti masukan seperti contoh di bawah ini :
Procedure BacaLarik(output A:larik, input N:integer)
{mengisi elemen larik A[1..N] dengan nilai yang dibaca dari piranti masukan}
{K. Awal : N adalah jumlah elemen efektif larik, nilainya terdefinisi}
{K. Akhir : seluruh elemen larik A berisi nilai-nilai yang dibaca dari piranti masukan}
Deklarasi :
K : integer
Deskripsi :
Larik Bertype Terstruktur
Larik tidak hanya dapat berisi data bertype tunggal, tapi dapat juga berisi data yang bertipe
terstruktur Contoh :
const Nmaks = 100
type Mahasiswa : record <nim : integer,
Halaman 21 Contoh Cara mengacu elemen TabMhs :
1. TabMhs[2].Nim
mengacu field Nim dari elemen kedua larik
2. Write(TabMhs[k].KodeMK)
Tugas
Tugas
1
1
Buatlah dalam notasi algoritma atau bahasa C :
1.Definisikan sebuah type terstruktur untuk menyatakan data nasabah disebuah bank. Data nasabah terdiri atas field Nomor Account, Nama Nasabah, Alamat Nasabah, Kota Nasabah, dan Nomor Telpon Nasabah.
Halaman 23
2.Dari soal nomor 1 buatlah program dalam bahasa pemrograman berbasis bahasa C, untuk memasukkan data nasabah sebanyak N, dengan N diinputkan dari papan ketik, kemudian menuliskan kembali semua data nasabah dalam bentuk matrik.
Petunjuk :
Gunakan notasi pengulangan untuk menyelesaikan permasalahan tersebut
ADT (Abstract Data Type)
ADT (Abstract Data Type)
z ADT adalah definisi type dan sekumpulan primitif (operasi dasar) terhadap type
tersebut.
z Type diterjemahkan menjadi type terdefinisi dalam bahasa pemrograman yang
Halaman 25 Primitif dalam konteks pemrograman
prosedural, diterjemahkan menjadi fungsi dan prosedur.
Primitif dikelompokkan menjadi :
1. Konstruktor/Kreator, pembentuk nilai type. Biasanya namanya diawali dengan Make.
2. Selektor, untuk mengakses komponen type. Biasanya namanya diawali dengan
3. Prosedur Pengubah nilai komponen 4. Validator komponen type, yang
dipakai untuk mengetes apakah dapat membentuk type sesuai batasan.
5. Destruktor/Dealokator, yaitu untuk
menghancurkan nilai objek, sekaligus memori penyimpannya
6. Baca/tulis, untuk interface dengan
Halaman 27 7. Operator Relasional terhadap type
tersebut untuk mendefinisikan lebih besar, lebih kecil, sama dengan dan sebagainya.
8. Aritmatika terhadap type tersebut, dalam pemrograman biasanya hanya terdefinisi untuk bilangan numerik. 9. Konversi dari type tersebut ke type
ADT biasanya diimplementasi menjadi dua buah modul, yaitu :
1. Definisi/spesifikasi type dan primitif
- Spesifikasi type sesuai dengan bahasa yang dipakai
- Spesifikasi dari primitif sesuai dengan kaidah dalam konteks prosedural, yaitu :
a. Fungsi : nama, domain, range, dan pre kondisi jika ada
b. Prosedur : Keadaan Awal, Keadaan Akhir dan proses yang dilakukan
2. Body/realisasi dari primitif, berupa kode program dalam bahasa yang bersangkutan. Realisasi fungsi dan prosedur harus sedapat mungkin memanfaatkan Selektor dan
Halaman 29
4. Linked List (List Linier)
4. Linked List (List Linier)
4.1. Definisi
List linier adalah
sekumpulan elemen
bertype sama, yang mempunyai
keterurutan tertentu, yang setiap
elemennya terdiri dari 2 bagian :
Type Elmtlist = record
Dengan Info Type adalah sebuah type
terdefenisi yang menyimpan informasi
sebuah elemen list ; Next adalah address
dari elemen berikutnya ( suksesor ).
Dengan demikian, jika didefinisikan
First
Halaman 31
Jadi, sebuah list linier dikenali :
z elemen pertamanya, biasanya melalui alamat
elemen pertama yang disebut : First
z alamat elemen berikutnya ( suksesor ), jika
kita mengetahui alamat sebuah elemen , yang dapat diakses melalui field NEXT
z setiap elemen mempunyai alamat, yaitu tempat elemen disimpan dapat diacu.Untuk mengacu sebuah elemen , alamat harus
terdefenisi . Dengan alamat tersebut Informasi yang tersimpan pada elemen list dapat diakses .
z elemen terakhirnya. Ada berbagai cara untuk
Jika L adalah list , dan P adalah address :
Alamat elemen pertama list L dapat diacu
dengan notasi :
First (L)
Elemen yang diacu oleh P dapat dikonsultasi
informasinya dengan notasi :
Info(P)
Halaman 33
Beberapa defenisi :
1. List L adalah List kosong , jika First (L) = Nil
II. Skema
traversal
untuk list
linier
List terdiri dari sekumpulan elemen.
Seringkali diperlukan untuk memproses
setiap elemen list dengan cara yang sama.
Karena itu salah primitif operasi konsultasi
dasar pada struktur list adalah traversal,
Halaman 35
Karena Urutan akses adalah dari elemen
pertama sampai dengan elemen
terakhir,
maka traversal list secara
natural dilakukan dari elemen pertama,
suksesornya, dan seterusnya sampai
Skema traversal yang dipakai adalah Sbb :
Procedure SKEMAListTransversal1( Input L : List ) {K. Awal : List L terdefinisi , mungkin kosong }
{K. Akhir : semua elemen list L dikunjungi dan telah diproses }
{Proses : Traversal sebuah list linier. Dengan MARK,
tanpa pemrosesan khusus pada list kosong}
Halaman 37
Deklarasi :
P : address { address untuk traversal , type terdefenisi }
Deskripsi : Inisialisasi
P ← First ( L ) { First Element } While ( P ≠Nil ) do
Proses ( P )
P ← Next ( P ) { Next element } endwhile
Procedure SKEMAListTransversal 2( Input L : List ) { K. Awal : List L terdefenisi , mungkin kosong } { K. Akhir : semua elemen list L “dikunjungan “
dan telah diproses }
{ Proses : Transversal sebuah list linier yang
diidentifikasi oleh elemen pertama L , Dengan MARK dan pemrosesan
khusus pada list kosong }
Halaman 39
Deklarasi
P : address { address untuk traversal , type terdefenisi }
Deskripsi
Insialisasi
P ← First ( L ) { First Element }
Repeat
Proses ( P )
P ← Next ( P ) { Next element }
Halaman 41
III. Skema Sequential Search untuk list
linier
Selain traversal, proses pencarian suatu elemen list adalah primitif yang sering kali
didefinisikan pada struktur list. Pencarian dapat berdasarkan nilai, atau berdasarkan alamat.
III.1. Search suatu Nilai, output adalah address
Search ini sering dipakai untuk mengenali
suatu elemen list berdasarkan nilai informasi yang disimpan pada elemen yang dicari.
Procedure SKEMAListSearch1 ( Input L : List, X : InfoType, Output P :
address, Found: Boolean )
{ K. Awal : List linier L sudah terdefinisi dan siap dikonsultasi, X terdefenisi }
{ K.Akhir : P : address pada pencarian beurutan, dimana X diketemukan, P = Nil jika
Halaman 43 {Proses : Sequential Search harga X pada sebuah
list linier L, Semua elemen diperiksa dengan intruksi yang sama, versi dengan Boolean}
Deklarasi
P ← First ( L ) Found ← false
While ( P ≠ Nil ) and ( not found ) do if X = Info (P) then
Found ←True else
P ← Next (P) endif
endwhile { P = Nil or Found}
Halaman 45
III. 2. Search suatu Elemen yang
beralamat tertentu
Procedure SKEMAList Search@( Input L : List, P : address, Found: Boolean )
{K. Awal : List linier L sudah terdefinisi dan siap dikonsultasi, X terdefenisi }
{K.Akhir : Jika ada elemen list beralamat P, Found berharga true, Jika tidak ada elemen list beralamat P, Found berharga false }
Deklarasi
Pt : address
Deskripsi
Pt ← First ( L ) Found ← false
While ( Pt ≠ Nil ) and ( not found ) do if Pt = P then
Found ← true else
Pt ← Next (Pt) endif
Halaman 47
IV. Definisi fungsional list linier dan
algoritmanya
Secara fungsional, pada sebuah list linier biasanya dilakukan pembuatan,
penambahan atau penghapusan elemen yang dapat ditulis sebagai berkut :
Jika diberikan L, L1 dan L2 adalah list linier dengan elemen ElmtList, maka
operasi yang dapat dilakukan :
IV. 1. Pengetesan List Kosong
Pemeriksaan apakah sebuah list kosong sangat penting, karena Keadaan Awal dan
Keadaan Akhir beberapa prosedur harus didefinisikan berdasarkan keadaan list.
Operasi pada list kosong sering kali membutuhkan penanganan khusus
Halaman 49
Function
IsEmptyList (L : List )
→
boolean
{ Test apakah sebuah list L kosong,
Mengirimkan true jika list kosong, false
jika tidak kosong}
Deklarasi
Deskripsi
IV.2 Pembuatan sebuah elemen pada
list linier
Pembuatan sebuah list berarti membuat
sebuat list KOSONG, yang selanjutnya
siap diproses (ditambah elemennya,
dsb). Realisasi algoritmik dari
Halaman 51 Procedure CreateList( Output L : List )
{K. Awal : Sembarang }
K. Akhir : terbentuk list L yang kosong : First (L) diinisialisasi dengan NIL )
Proses : Membuat list kosong}
Deklarasi
Deskripsi
IV. 3 Penyisipan sebuah elemen
pada list linier
Fungsi insert (penyisipan) harus dijabarkan lebih rinci, karena dapat menjadi penyisipan sebagai elemen pertama, setelah sebuah address P atau penyisipan menjadi elemen terakhir atau
bahkan menjadi elemen ditengah
Penyisipan sebuah elemen dapat dilakukan
Halaman 53 IV. 2.1. INSERT-First (Address)
Menambahkan sebuah elemen yang diketahui alamatnya sebagai elemen pertama list.
Procedure InsertFirst (Input/Output L:List, Input P: address)
{K. Awal : List L mungkin kosong
{K. Akhir : P adalah elemen pertama list L}
{Proses : Insert sebuah elemen beralamat P sebagai elemen pertama list linier L yang mungkin kosong}
Deklarasi Deskripsi
IV.2.2 INSERT-First (Nilai)
Menambahkan sebuah elemen yang diketahui nilainya sebagai elemen pertama list.
Procedure InsFirst (Input/output L :List, Input E : infotype )
{ K. Awal : List L mungkin kosong }
{ K. Akhir : Sebuah elemen dialokasikan dan menjadi elemen pertama list L, jika alokasi berhasil. Jika alokasi gagal
list tetap seperti semula }
{ Proses : Insert sebuah elemen sebagai elemen pertama list}
Deklarasi
P : address Deskripsi
Alokasi (P)
Halaman 55 IV.2.2. INSERT-AFTER
Menyisipkan sebuah elemen beralamat P sebagai
suksesor dari sebuah elemen list linier yang beralamat Prec
Procedure InsertAfter ( Input P, Prec: address )
{K. Awal : Prec adalah elemen list, prec ≠ Nil, P sudah dialokasikan, P ≠ Nil, Next (P) = Nil
K. Akhir : P menjadi suksesor Prec
Proses : Insert sebuah elemen beralamat P pada List linier L}
Deklarasi Deskripsi
IV. 2.3. INSERT – Last
Menyisipkan sebuah elemen beralamat P sebagai elemen terakhir sebuah list linier. Ada dua kemungkinan list kosong atau tidak kosong
Procedur InsertLast@(Input/Output L: List, Input P : address)
{K. Awal : List L mungkin kosong, P sudah dialokasi, P ≠ Nil, Next (P) = Nil
K. Akhir : P adalah elemen terakhir list L
Halaman 57 Deklarasi
Last : address { address untuk traversal}
Deskripsi
If Fisrt (L) = Nil then { insert sebagai elemen pertama} InsertFirst(L, P)
Else
{ Traversal list sampai address terakhir} Last ← First (L)
While (Next (Last ) ≠ Nil ) do Last ← Next (Last )
endwhile {Next ( Last) = Nil, Last adalah elemen terakhir; insert P after last }
Procedure InsertLast(Input/output L :List, Input E : Infotype) { K. Awal : List L mungkin kosong, P sudah dialokasi,
P ≠ Nil, Next(P)=Nil
K. Akhir : P adalah elemen terakhir list L
Proses : Insert sebuah elemen beralamat P sebagai
elemen terakhir dari list linier L yang mungkin kosong }
Deklarasi
Last : address { address untuk traversal }
Deskripsi
Alokasi (P)
Halaman 59
IV.3. Penghapusan sebuah elemen pada list linier
Penghapusan harus dijabarkan lebih rinci, Karena penghapusan elemen dapat merupakan
pertama, setelah sebuah address P atau
penghapusan elemen terakhir. Perbedaan ini melehirkan 3 operasi dasar penghapusan
elemen list yang diturunkan dari definisi fungsional inimenjadi realisasi algoritma.
Operasi penghapusan dapat mengakibatkan list
IV.3.1. DELETFirst : menghapus elemen pertama list linier
a. Elemen yang dihapus dicatat alamatnya
Procedure DeleteFirst@ (Input/Output L : List, Output P : address)
{K. Awal : List L tidak kosong, minimal 1 elemen pertama pasti ada }
{K. Akhir : menghapus elemen pertama L
P adalah @ elemen pertama L sebelum
penghapusan, L yang baru adalah Next (L)
Deklarasi Deskripsi
P ← First (L)
Halaman 61
Procedure DeleteFirst (Input/Output L : List, Output E : InfoType)
{K. Awal : List L tidak kosong, minimal 1 elemen pertama pasti ada }
{K. Akhir : menghapus elemen pertama L
E adalah Nilai elemen pertama L sebelum penghapusan, L yang baru adalah Next (L)
Deklarasi Deskripsi
P ← First (L) E ← Info (P)
IV. 3.2. Delete After :
Penghapusan suksesor sebuah elemen :
Procedure DeleteAfter ( Input Prec : adrress, Output
P : address )
{ K. Awal : List tidak kosong, Prec adalah elemen list , Next (Prec) ≠ Nil } Prec ≠elemen terakhir K. Akhir : Menghapus suksesor Prec, P adalah @
suksesor Prec sebelum penghapusan, Next (Prec) yang baru adalah suksesor dari
suksesor Prec sebelum penghapusan }
Deklarasi Deskripsi
Halaman 63
Dengan primitip ini, maka penghapusan sebuah beralamat P dapat dilakukan dengan : mencari predesesor dari P, yaitu alamat Prec memakai DeleteAfter (Prec)
Procedure DeleteP ( Input/Output L ; List, Output
P : address )
{ K. Awal : List L tidak kosong , P adalah elemen list L K. Akhir : Menghapus P dari list, P mungkin
elemen pertama, “tengah” atau terakhir }
Deklarasi
Prec : address { alamat predesesor }
{ Cari predesesor P }
if (P = First (L) then {Delete list dengan satu elemen }
DeleteFirst (L,P) else
Prec ← First (L)
While (Next(Prec) ≠ P ) do Prec ← Next (Prec)
Halaman 65 IV. 3.3. DELETELast :
Menghapus elemen terakhir list dapat dilakukan jika alamat dari elemen sebelum elemen terakhir
diketahui. Persoalan selanjutnya menjadi persoalan DeleteAfter, kalau last bukan satu- satunya elemen list linier. Ada dua kasus, yaitu list menjadi kosong atau tidak.
Procedure DeleteLast (Input L : List, Output P : address)
{K. Awal : List L tidak kosong, minimal mengandung 1 elemen
K. Akhir : menghapus elemen terakhir dari list, list mungkin menjadi kosong
Deklarasi
Last , preclast :address { address untuk traversal }
Deskripsi
{ Find last dan address sebelum last } Last ← First (L)
Preclast ← Nil { predesesor dari L tak terdefenisi } While ( Next ( Last ) ≠ Nil do { Traversal list sampai @ terakhir }
Preclast ← Last ; Last ← Next ( last )
endwhile { Next ( Last ) = Nil, Last adalah elemen terakhir; preclast = sebelum last }
P ← Last
If Preclast = Nil then { list dg 1 elemen, jadi kosong } First(L) ← Nil
Halaman 67
IV. 5. Konkatenasi dua buah list linier
Concat adalah menggabungkan dua list. Dalam contoh berikut list kedua disambungkan ke list pertama. Jadi Last (L1) menjadi predesesor First (L2). Realisasi
algoritma adalah sebuah prosedur sebagai berikut :
Procedure CONCAT (Input L1, L2 : List, Output :
L3 : List )
{K. awal : L1 ≠ L2, L1 ≠ L3,dan L3 ≠ L2; L1, L2 mungkin kosong
Deklarasi
Last1 : address { alamat elemen terakhir list pertama }
Deskripsi
Cratelist (L3) {inisialisasi list hasil }
If Fist (L1) = Nil then
First (L3) ← First (L2)
Else { Traversal list 1 sampai address terakhir, Hubungkan last dengan Fisrt 2}
First (L3) ← First (L1) Last1 ← First (L1)
While ( Next (Last 1 ) ≠ Nil ) do Last1 ← Next (Last 1)
Halaman 69
Bagian Deklarasi dari algoritma pada List Linier : Deklarasi
type InfoType = … {Sebuah type terdefinisi} type Address pointer to ElmtL
type ElmtL = record
<Info : InfoType, Next : Address >
type List = record <First : Address > {Deklarasi Nama Peubah}
L : List
Soal
Soal
-
-
Soal
Soal
Latihan
Latihan
I. Apakah perbedaan struktur data list linier ditinjau dari sudut pandang operasinya, jika dibandingkan dengan struktur data stack
dan queue?
II. Untuk data yang bagaimanakah yang dapat direpresentasikan dengan menggunakan
struktur data list linier?
III. Diketahui sebuah list linier dengan elemen bertipe integer, buatlah :
1. Sebuah prosedur untuk menghitung jumlah elemen list yang genap
Halaman 71 3. Prosedur untuk menghitung banyaknya
elemen list yang positif (lebih besar dari nol)
4. Prosedur untuk mencetak elemen list yang genap
IV. Diketahui sebuah list dengan elemen bertype integer terurut membesar, buatlah :
1. Fungsi untuk mengirimkan elemen pertama list
2. Fungsi untuk mencari elemen list yang minimum
5. Stack (
5. Stack (
Tumpukan
Tumpukan
)
)
5.1. Definisi
STACK (Tumpukan) adalah list linier yang : 1. Dikenali elemen puncaknya (TOP)
2. Aturan penyisipan dan penghapusan elemennya tertentu :
Halaman 73
Karena aturan penyisipan dan penghapusan semacam itu, TOP adalah satu-satunya alamat tempat terjadi
operasi. Elemen yang ditambahkan paling akhir akan menjadi elemen yang akan dihapus.Dikatakan
bahwa elemen Stack akan tersusun secara LIFO (Last In First Out).
Maka secara lojik, sebuah STACK dapat
digambarkan sebagai list linier yang setiap elemennya adalah
Type ElmtS = record
dengan InfoType terdefinisi yang menentukan informasi yang disimpan pada setiap
elemen stack, dan address adalah “alamat” dari elemen
Selain itu alamat elemen terbaru (TOP) dicatat, sedangkan alamat elemen yang paling
“bawah”, yaitu yang paling lama biasanya diebut BOTTOM.
TOP adalah elemen pertama list, supaya
Halaman 75 Sehingga jika S adalah sebuah Stack, dan P
adalah address maka
¾ Top (S) adalah alamat elemen TOP, dimana
operasi penyisipan/penghapusan dilakukan.
¾ Info (P) adalah informasi yang disimpan pada
alamat P
¾ Next (P) adalah alamat suksesor P
¾ ElmtS (P) adalah sebuah elemen stack yang
beralamat P
¾ Stack kosong adalah Stack dengan Top (S) =
Bagian Deklarasi dari algoritma pada Stack : Deklarasi
type InfoType = … {Sebuah type terdefinisi} type Address pointer to ElmtS
type ElmtS = record
<Info : InfoType, Next : Address >
type Stack = record <TOP : Address> {Deklarasi Nama Peubah}
Halaman 77
Pada stack, jarang sekali dilakukan
traversal, karena keunikan Stack justru
pada operasi yang hanya menyangkut
elemen TOP. Namun dibutuhkan
traversal misalnya untuk mencetak isi
Stack.
5.3. Search pada Stack
Pada stack, elemen yang diproses hanyalah
elemen pada TOP. Maka hampir tidak pernah dilakukan search.
5.2. Traversal
5.4.
5.4.
Operasi
Operasi
dan
dan
fungsi
fungsi
dasar
dasar
pada
pada
STACK.
STACK.
a. Test STACK kosong
Mengetahui bahwa stack kosong atau
Halaman 79
function StackEmpty (S : STACK) →
Boolean
{ TEST stack kosong : Mengirim true, jika
tumpukan kosong, false jika tumpukan tidak kosong}
Deklarasi
Deskripsi
b. Pembuatan STACK kosong
Membuat Stack kosong diperlukan untuk memulai memakai stack. Realisasi algoritma dari definisi fungsional ini adalah sebuah prosedur yang
melakukan inisialisasi stack sebagai berikut
Procedure CreateEmptyS (Output S : STACK)
{K. Awal : sembarang,
K. Akhir : sebuah stack S yang kosong siap dipakai terdefinisi
Proses : Membuat stack kosong }
Deklarasi Deskripsi
Halaman 81
c.Penambahan sebuah elemen pada
STACK (Push)
Penambahan selalu dilakukan pada TOP, dan karena alamat TOP diketahui maka prosesnya sederhana. Berikut ini akan diberikan skema
prosedur penyisipan tersebut. Realisasi algoritma dari definisi fungsional ini adalah salah satu dari dua buah prosedur yang melakukan penambahan elemen stack sebagai berikut. Prosedur pertama menambahkan suatu ElmtS yang diketahui
procedure Push@ (Input/Output S : STACK Input P : address)
{Menambahkan sebuah elemen baru pada TOP sebuah stack, dengan elemen yang diketahui alamatnya}
{K.Awal : Stack mungkin kosong, P terdefinisi (berarti terdefinisi informasinya, Next (P) = Nil}
{K.Akhir : Top (S) adalah P}
Deklarasi Deskripsi
{ insert sebagai elemen pertama } Next (P) ← TOP (S)
Halaman 83
procedure Push( Input / Output S:STACK Input E: InfoType ) { Menambahkan sebuah elemen baru pada TOP sebuah stack,
dengan elemen yang diketahui informasinya }
{ K. Awal : Stack mungkin kosong , E terdefenisi , alokasi alamat selalu berhasil }
{ K. Akhir : TOP (S) berisi E )
Deklarasi
P : address
Deskripsi
Alokasi ( P ) { alokasi selau berhasil } Info(P) ← E
{ insert sebagai elemen pertama } Next(P) ← TOP(S)
d. Penghapusan sebuah elemen pada STACK (Pop)
Penghapusan elemen Stack selalu dilakukan pada TOP , hanya saja harus diperhitungkan bahwa mugkin Stack akan menjadi kosong akibat
terjadinya penghapusan. Jika Stack menjadi
kosong , maka harga TOP harus diganti . Realisasi algoritma dari definisi funsional ini adalah salah satu dari dua buah prosedur yang melakukan pengambilan elemen stack sebagai berikut .
Halaman 85 procedure PopStack@(Input/Output S : STACK
Output P : address) {K.Awal : Stack tidak kosong
K.Akhir : Alamat elemen Top (S) disimpan pada P, sehingga informasinya dapat diakses melalui P
Proses : Menghapus elemen stack, stack tidak boleh kosong dan mungkin menjadi kosong }
Deklarasi Deskripsi
P ← TOP (S)
procedure PopStack(Input/Output S : STACK Output E : InfoType)
{K.Awal : Stack tidak kosong
K.Akhir : Alamat elemen Top (S) disimpan pada E, alamat TOP yang lama didealokasi
Proses : Menghapus elemen stack, stack tidak boleh kosong dan mungkin menjadi kosong }
Deklarasi
P : address Deskripsi
P ← TOP (S) E ← Info(P)
Halaman 87
Soal
Soal
-
-
Soal
Soal
Latihan
Latihan
1. Mengapa cara penyusunan elemen pada Stack sering disebut tersusun secara
LIFO?
2. Mengapa pada Stack Traversal dan Search jarang dilakukan?
4. Buatlah sebuah fungsi untuk menghitung jumlah elemen stack yang genap, jika diketahui sebuah stack dengan elemen bertype integer.
5. Buatlah fungsi/prosedur untuk mencetak elemen stack yang ganjil
6. Buatlah juga fungsi untuk menghitung rata-rata elemen Stack yang genap
7. Buatlah sebuah fungsi untuk mengirimkan elemen pertama Stack
Halaman 89
6. Queue (
6. Queue (
Antrian
Antrian
)
)
6.1. Definisi
Queue (Antrian) adalah list linier yang :
1. Dikenali elemen pertama (Head) dan elemen terakhirnya (Tail)
2. Aturan penyisipan dan penghapusan elemennya disefinisikan sebagai berikut :
- Penyisipan selalu dilakukan setelah elemen terakhir
- Penghapusan selalu dilakukan pada elemen pertama
Struktur data ini banyak dipakai dalam informatika misalnya untuk merepresentasi :
1. Antrian job dalam sistem operasi 2. Antrian dalam dunia nyata
Maka secara lojik, sebuah Queue dapat digambarkan sebagai list linier yang setiap elemennya adalah :
Type ElmtQ = record
Halaman 91
dengan InfoType terdefinisi yang menentukan
informasi yang disimpan pada setiap elemen queue, dan address adalah “alamat” dari
elemen
Selain itu alamat elemen Pertama (Head) dan elemen terakhir (Tail) dicatat.
Maka jika Q adalah Queue dan P adalah Address, penulisan untuk Queue adalah :
Bagian Deklarasi dari algoritma pada Queue : Deklarasi
type InfoType = … {Sebuah type terdefinisi} type Address pointer to ElmtQ
type ElmtQ = record
<Info : InfoType, Next : Address >
type Queue = record <Head : Address, Tail : Address> {Deklarasi Nama Peubah}
Halaman 93
Pada queue, jarang sekali dilakukan
traversal, karena keunikan Queue justru
pada operasi yang hanya menyangkut
elemen pertama dan terakhir. Namun
dibutuhkan traversal misalnya untuk
mencetak isi Antrian.
6.3. Search pada Queue
Pada Queue, elemen yang diproses hanyalah elemen pada pertama dan terakhir. Maka hampir tidak pernah dilakukan search.
6.2. Traversal
6.4.
6.4.
Operasi
Operasi
dan
dan
fungsi
fungsi
dasar
dasar
pada
pada
Queue.
Queue.
a. Test Queue kosong
Mengetahui bahwa Queue kosong atau tidak sangat penting, sebab semua operasi akan
dilakukan berdasarkan kosong atau tidaknya suatu Queue. Realisasi algoritma dari definisi fungsional ini adalah sebuah fungsi yang
Halaman 95
function IsQEmpty (Q : Queue) → Boolean { TEST Queue kosong : Mengirim true, jika
antrian kosong, false jika antrian tidak kosong}
Deklarasi Deskripsi
b. Pembuatan Queue kosong
Membuat Queue kosong diperlukan untuk memulai memakai Queue. Realisasi algoritma dari definisi fungsional ini adalah sebuah prosedur yang
melakukan inisialisasi Queue sebagai berikut :
Procedure CreateEmptyQ (Output Q : Queue)
{K. Awal : sembarang,
K. Akhir : sebuah queue Q yang kosong terbentuk Proses : Membuat queue kosong }
Deklarasi Deskripsi
Halaman 97
c.Penambahan sebuah elemen pada
Queue
Penambahan selalu dilakukan pada ekor, dan karena alamat ekor diketahui maka prosesnya sederhana, yaitu hanya
InsertLast.
Realisasi algoritma dari definisi fungsional ini adalah salah satu dari dua buah prosedur yang melakukan penambahan elemen
Queue sebagai berikut :
Prosedur pertama menambahkan suatu
Halaman 99
procedure InsertQ@ (Input/Output Q : Queue
Input P : address)
{K.Awal : Queue mungkin kosong, P terdefinisi (berarti terdefinisi informasinya, Next (P) = Nil
K.Akhir : P menjadi elemen Tail dari Q dan Tail yang baru adalah P
Proses : Insert sebuah elemen beralamat P pada Tail dari antrian Q }
Deskripsi
If
IsQEmpty(Q)
then
Head(Q)
←
P
Tail(Q)
←
P
else
Next(Tail(Q))
←
P
Tail(Q)
←
P
Halaman 101
procedure InsertQ
(Input/Output Q
: Queue
Input
E : InfoType
)
{K.Awal : Queue mungkin kosong, E
terdefinisi
K.Akhir : Elemen Tail dari Q yang baru
bernilai E
Proses
: Insert sebuah elemen nilai pada
Tail dari antrian Q }
Deskripsi
Alokasi (P) Info (P) ← E
If IsQEmpty(Q) then Head(Q) ← P
Tail(Q) ← P else
Next(Tail(Q)) ← P Tail(Q) ← P
Halaman 103 d. Penghapusan Elemen Pada QueuE
Halaman 105
procedure DeleteQ@(Input/Output Q : Queue Output P : address)
{K.Awal : Queue tidak kosong
K.Akhir : P bukan lagi elemen dari Q, P ≠ Nil, Next(P) = Nil
Proses : Menghapus elemen Head dari antrian, antrian tidak boleh kosong dan
mungkin menjadi kosong }
P
←
Head(Q)
Head(Q)
←
Next(Head(Q))
if (Head(Q) = Nil) then
Tail(Q)
←
Nil
endif
Halaman 107
procedure DeleteQ(Input/Output Q : Queue Output E : InfoType) {K.Awal : Queue tidak kosong
K.Akhir : Jika P adalah Head(Q). P bukan lagi elemen dari Q, P ≠ Nil,
Next(P) = Nil
Proses : Menghapus elemen Head dari antrian, antrian tidak boleh kosong dan
mungkin menjadi kosong }
P
←
Head(Q)
E
←
Info(Head(Q))
Head(Q)
←
Next(Head(Q))
if (Head(Q) = Nil) then
Tail(Q)
←
Nil
endif
Halaman 109
Soal
Soal
-
-
Soal
Soal
1. Mengapa cara penyusunan elemen pada Queue Sering disebut tersusun secara FIFO?
2. Mengapa pada Queue Traversal dan Search jarang dilakukan?
3. Penghapusan elemen pada Queue selalu
4. Buatlah sebuah fungsi untuk menghitung jumlah elemen queue yang ganjil, jika diketahui sebuah queue dengan elemen bertype integer.
5. Buatlah fungsi/prosedur untuk mencetak elemen queue yang genep
6. Buatlah juga fungsi untuk menghitung rata-rata elemen queue yang ganjil
7. Buatlah sebuah fungsi untuk mengirimkan elemen pertama queue
Halaman 111
7.
7.
Pohon
Pohon
(Tree)
(Tree)
7.1. Definisi Rekurens Dari Pohon
Sebuah pohon adalah himpunan terbatas tidak kosong, dengan elemen yang dibedakan sebagai berikut :
1. Sebuah elemen yang dibedakan dari yang lain yang disebut sebagai AKAR (root) dari pohon
Beberapa Istilah 1. Hutan
Hutan adalah sequence (list) dari pohon
2. Simpul (Node)
Simpul adalah elemen dari pohon yang
memungkinkan akses pada sub pohon dimana simpul tersebut berfungsi sebagai Akar
3. Cabang
Halaman 113
4. Ayah
Akar dari sebuah pohon adalah Ayah dari sub pohon
5. Anak
Anak dari sebuah pohon adalah Sub pohon
6. Saudara
Saudara adalah simpul-simpul yang mempunyai Ayah yang sama
7. Daun
8. Jalan (Path)
Jalan adalah suatu urutan tertentu dari Cabang
9. Derajat
Derajat sebuah pohon adalah banyaknya anak dari dari pohon tersebut.
Jika sebuah simpul berderajat N disebut pohon N-aire
Halaman 115
10. Tingkat (Level)
Level pohon adalah panjangnya jalan dari Akar sampai dengan simpul yang
bersangkutan. Panjang dari jalan adalah banyaknya simpul yang dikandung pada
jalan tersebut. Akar mempunyai tingkat sama dengan 1.
11. Kedalaman (Tinggi)
Kedalaman (Tinggi) dari pohon adalah nilai maksimum dari tingkat simpul yang ada pada pohon tersebut. Kedalaman adalah panjang maksimum jalan dari Akar menuju ke sebuah daun
12. Lebar
Halaman 117
7.2. Struktur Pohon Biner
Definisi
Sebuah pohon biner (Binary Tree) adalah himpunan terbatas yang :
¾ Mungkin kosong atau
¾ Terdiri dari sebuah simpul yang disebut
sebagai Akar dan dua buah himpunan lain yang disjoint yang merupakan pohon biner yang disebut sebagai Sub Pohon Kiri (Left)
Pohon biner merupakan tipe yang sangat penting dari struktur data dan banyak dijumpai
dalam berbagai terapan. Karakteristik yang dimiliki oleh pohon biner adalah bahwa
setiap simpul paling banyak hanya
memiliki dua buah anak, dan mungkin tidak punya anak.
Halaman 119
Notasi Prefiks, Infiks dan Postfiks 1. Notasi Prefiks
2. Notasi Infiks
Halaman 121
3. Notasi Posfiks
Rekonstruksi Algoritma
{Deklarasi Type}
Type Infotype = … {terdefinisi}
Type node = record <Info : infotype, Left : address, Right: address > Type BinTree : address
Halaman 123 function Akar (P : BinTree)→ infotype
{Mengirimkan nilai Akar pohon biner P}
function Left (P : BinTree)→ infotype {Mengirimkan anak kiri pohon biner P}
function Right (P : BinTree)→ infotype
function IsEmpty(P : BinTree)→boolean { Test apakah sebuah pohon kosong,
mengirimkan True jika kosong dan False jika tidak}
procedure MakeTree(input Akar : infotype, L : BinTree, R : BinTree, output P : BinTree) { K. Awal : sembarang
K. Akhir : Terbentuk sebuah pohon biner
Halaman 125
{Traversal}
Procedur PreOrder(input P : BinTree) {K. AWAL : P terdefinisi
K. AKHIR : Semua simpul P sudah
diproses secara preorder}
Procedure InOrder(input P : BinTree) {K. AWAL : P terdefinisi
Procedure PostOrder(input P : BinTree) {K. AWAL : P terdefinisi
K. AKHIR : Semua simpul P sudah
diproses secara postorder}
Procedure PrintTree(input P : BinTree, h : integer) {K. AWAL : P terdefinisi, h adalah jarak indentasi
Halaman 127
{Search}
function Search(P : BinTree, X : infotype)→boolean {Mengirimkan True jika ada node P bernilai X, false
jika tidak}
{fungsi lain}
function NbElmt(P : BinTree)→integer
function NbDaun(P : BinTree) →integer
{ Mengirimkan banyaknya daun pohon biner P} function IsUnerLeft(P : BinTree) →boolean
{ Mengirimkan True jika pohon biner tidak
kosong P adalah pohon unerleft yaitu hanya mempunyai sub pohon kiri}
function IsUnerRight(P : BinTree) →boolean { Mengirimkan True jika pohon biner tidak
Halaman 129 function IsBin(P : BinTree)→boolean
{ Mengirimkan True jika pohon biner tidak
kosong P adalah pohon biner yaitu mempunyai sub pohon kanan dan sub pohon kiri}
function IsSkewLeft(P : BinTree)→boolean
{ Mengirimkan True jika pohon biner P adalah pohon condong kiri}
function IsSkewRight(P : BinTree)→boolean { Mengirimkan True jika pohon biner P adalah
function Tinggi(P : BinTree)→integer
{ Mengirimkan tinggi dari pohon biner P}
function Level(P : BinTree, X : infotype)→integer { Mengirimkan level dari node X yang merupakan
salah satu simpul dari pohon biner P}
Halaman 131
Procedure AddDaunTerkiri(input/output P:BinTree, input X: infotype)
{K. AWAL : P boleh kosong
K. AKHIR : P bertambah simpulnya, dengan X adalah simpul daun terkiri}
Procedure AddDaun(input/output P:BinTree, input X, Y : infotype, input Kiri : boolean)
{K. AWAL : P tidak boleh kosong, X adalah salah satu daun pohon Biner P
K. AKHIR : P bertambah simpulnya, dengan Y adalah anak kiri X (jika kiri) atau
Procedure DelDaunTerkiri(input/output
P:BinTree, output X: infotype) {K. AWAL : P tidak kosong
K. AKHIR: P dihapus daun terkirinya dan
didealokasi, dengan X adalah info yang semula disimpan pada daun terkiri yang dihapus}
Procedure DelDaun(input/output P:BinTree, output X: infotype)