pengertian struktur data

Upload: yopi-riadi

Post on 12-Jul-2015

133 views

Category:

Documents


0 download

TRANSCRIPT

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 disimpan, direkam atau direpresentasikan dalam bentuk tulisan, suara, gambar, sinyal atau 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, misalny a String 2. Struktur Data, meliputi a. Struktur data sederhana, misalnya array dan b. Struktur data majemuk, yang terdiri Dari : Linier : Stack, Queue, serta List dan Multilist Non Linier : Pohon Biner dan Graph Pemakaian struktur data yang tepat di dalam proses pemrograman akan menghasilkan algoritma yang lebih jelas dan tepat, sehingga menjadikan program secara keseluruhan lebih efisien dan sederhana. Struktur data yang standar yang biasanya digunakan dibidang informatika adalah : List linier (Linked List) dan variasinya Multilist Stack (Tumpukan) Queue (Antrian) Tree ( Pohon ) Graph ( Graf ) 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 jika P dideklarasikan sebagai Titik maka mengacu field pada P adalah P.x dan P.y. 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

Jika J adalah peubah (variabel) bertipe Jam maka cara mengacu tiap field adalah J.hh, J.mm dan J.ss Terjemahan dalam bahasa C : 1. type Titik : record diterjemahkan menjadi : typedef struct { float x; float y; } Titik; 2. type JAM : record Diterjemahkan menjadi : typedef struct , int hh; /*023*/ int mm; /*059*/ int ss; /*059*/ } Jam;

REVIEW ARRAY (LARIK) REVIEW ARRAY (LARIK) 1. Pendahuluan Larik adalah struktur data statik yang menyimpan sekumpulan elemen yang bertipe sama. Setiap elemen diakses langsung melalui indeksnya. Indeks larik harus tipe data yang menyatakan keterurutan misalnya integer atau karakter. Banyaknya elemen larik harus sudah diketahui sebelum program dieksekusi. Tipe elemen larik dapat berupa tipe sederhana, tipe terstruktur atau tipe larik lain. Nama lain array adalah Larik, tabel atau vektor

Cara Pendefinisian Array 1. Sebagai Peubah Contoh : L : array[1..50] of integer NamaMhs : array*a..j+ of string

2.

3.

Sebagai tipe baru Contoh : type LarikInt : array[1..100] of integer P : LarikInt 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 typedef int Larikint[Nmaks+1]; Larikint P; Cara Mengacu Elemen Larik Elemen larik diacu melalui indeksnya. Nilai indek harus terdefinisi. Contoh cara mengacu elemen larik adalah : L[4] {mengacu elemen keempat dari larik L } NamaMhs*b+ ,mengacu elemen kedua dari larik NamaMhsP[k] {mengacu elemen ke-k dari larik P, asalkan nilai k sudah terdefinisi } Menginisialisasi Larik 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 : for k 1 to N do A[k] 0 endfor

Mengisi elemen larik dari piranti masukan 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 : for k 1 to N do read (A[k]) endfor 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 TabMhs : array[1..Nmaks] of Mahasiswa Contoh Cara mengacu elemen TabMhs : 1. TabMhs[2].Nim mengacu field Nim dari elemen kedua larik 2. Write(TabMhs[k].KodeMK) menuliskan field KodeMK dari elemen ke k dari larik 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. Untuk setiap field definisikan type data yang cocok 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 Tugas dikumpulkan pada pertemuan berikutnya disertai listing program dan contoh keluarannya. ADT (Abstract Data Type) ADT (Abstract Data Type) ADT adalah definisi type dan sekumpulan primitif (operasi dasar) terhadap type tersebut. Type diterjemahkan menjadi type terdefinisi dalam bahasa pemrograman yang bersangkutan, misalnya menjadi record dalam Pascal/Ada dan Struct dalam bahasa C 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 Get. 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 input/output device 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 dasar dan sebaliknya. ADT biasanya diimplementasi menjadi dua buah modul, yaitu : Definisi/spesifikasi type dan primitif o Spesifikasi type sesuai dengan bahasa yang dipakai o 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 Body/realisasi dari primitif, berupa kode program dalam bahasa yang bersangkutan. Realisasi fungsi dan prosedur harus sedapat mungkin memanfaatkan Selektor dan Konstruktor.

1.

2.

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 < Info : InfoType, Next : address > 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 adalah alamt elemen pertama list, maka elemen berikutnya dapat diakses secara suksesif dari elemen pertama tersebut. Jadi, sebuah list linier dikenali : elemen pertamanya, biasanya melalui alamat elemen pertama yang disebut : First alamat elemen berikutnya ( suksesor ), jika kita mengetahui alamat sebuah elemen , yang dapat diakses melalui field NEXT 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 elemen terakhirnya. Ada berbagai cara untuk mengenali elemen akhir 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) Next(P) Beberapa defenisi : 1) List L adalah List kosong , jika First (L) = Nil 2) Elemen terakhir dikenali, dengan salah satu cara adalah karena Next(Last) =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, yaitu mengunjungi setiap elemen list untuk diproses.

Karena Urutan akses adalah dari elemen pertama sampai dengan elemen terakhir, maka traversal list secara natural dilakukan dari elemen pertama, suksesornya, dan seterusnya sampai dengan elemen terakhir. 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} Deklarasi 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 Terminasi 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 } Deklarasi : Deklarasi P : address { address untuk traversal , type terdefenisi } Deskripsi If (First ( L ) = Nil) then Write ( List kosong ) else

Insialisasi P First ( L ) , First Element Repeat Proses ( P ) P Next ( P ) { Next element } until P=Nil Terminasi 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. Biasanya dengan alamat yang ditemukan, akan dilakukan suatu proses terhadap elemen list tersebut. 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 tidak ketemu, Found berharga true jika harga X yang dicari ketemu, false jika tidak } {Proses : Sequential Search harga X pada sebuah list linier L, Semua elemen diperiksa dengan intruksi yang sama, versi dengan Boolean} Deklarasi Deskripsi 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} {Jika Found maka P adalah address dimana harga yang dicari diketemukan}

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 } {Proses : Sequential Search @ P pada sebuah list linier L, Semua elemen diperiksa dengan intruksi yang sama } 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 endwhile { Pt = Nil or Found} { Jika Found maka P adalah elemen list} 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 : ListEmpty, CreateList, Insert, Delete, Concat dan UpdateList 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 Realisasi algoritmik dari definisi fungsional ini adalah sebuah fungsi sebagai berikut. Function IsEmptyList (L : List ) boolean { Test apakah sebuah list L kosong, Mengirimkan true jika list kosong, false jika tidak kosong} Deklarasi Deskripsi return(First (L) = Nil)

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 defenisi funfsional ini adalah sebuah prosedur sebagai berikut. 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 First (L) Nil IV. 3 Penyisipan sebuah elemenpada 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 terhadap sebuah elemen yang sudah dialokasi (diketahui address-nya ), atau sebuah elemen yang hanya diketahui nilai Info-nya (berarti belum dialokasi). 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 Next (P) First (L) First (L) P 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) If P Nil then Info (P) E Next (P) First (L) First (L) P 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 Next (P) Next (Prec) Next (Prec) P 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 Proses : Insert sebuah elemen beralamat P sbg elemen terakhir dari list linier L yg mungkin kosong } 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 } InsertAfter (P, Last) endif

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) If (P Nil) then Info(P) E InsertLast@(L,P) 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 kosong, jika list semula hanya terdiri dari satu elemen. IV.3.1. DELETFirst : menghapus elemen pertama list linier 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) First (L) Next ( First (L) ) 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) a. Deklarasi Deskripsi P First (L) E Info (P) First (L) Next ( First (L) ) Dealokasi (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 P Next (Prec) Next (Prec) Next (Next (Prec)) 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 } Deskripsi { 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) endwhile { Next (Prec) = P , hapus P } DeleteAfter (Prec , P) endif 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 Proses : P adalah alamat elemen terakhir list sebelum penghapusan } 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 @ terakhirPreclast 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 Else Next ( preclast ) Nil endif 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 K. Akhir : L3 adalah hasil konkatenasi (menyambung) dua buah list linier, L2 ditaruh dibelakang L1 } 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) endwhile ,Next ( Last 1) First (L2)Next(Last1) First (L2)endif

Bagian Deklarasi dari algoritma pada List Linier : Deklarasi type InfoType = ,Sebuah type terdefinisitype Address pointer to ElmtL type ElmtL = record type List = record {Deklarasi Nama Peubah} L : List P : Address 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 2. Prosedur untuk menghitung rata-rata elemen list yang ganjil 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 : a) Fungsi untuk mengirimkan elemen pertama list b) Fungsi untuk mencari elemen list yang minimum c) Fungsi untuk menghitung banyaknya elemen yang lebih besar dari 100 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 : Penyisipan selalu dilakukan di atas TOP Penghapusan selalu dilakukan pada TOP 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 setiapelemen 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 penambahan dan penghapusan dengan mudah dan efisien dapat dilakukan. 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) = Nil ( tidak terdefinisi ) Bagian Deklarasi dari algoritma pada Stack : Deklarasi type InfoType = ,Sebuah type terdefinisitype Address pointer to ElmtS type ElmtS = record type Stack = record {Deklarasi Nama Peubah} S : Stack P : Address 5.3. Search pada Stack Pada stack, elemen yang diproses hanyalah elemen pada TOP. Maka hampir tidak pernah dilakukan search. 5.2. Traversal pada pada Stack Stack 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.4. Operasi Operasi dan dan fungsi fungsi dasar dasar pada STACK.. a. Test STACK kosong Mengetahui bahwa stack kosong atau tidak sangat penting, sebab semua operasi akan dilakukan berdasarkan kosong atau tidaknya suatu Stack. Realisasi algoritma dari definisi fungsional ini adalah sebuah fungsi yang melakukan test terhadap Stack sebagai berikut : function StackEmpty (S : STACK) Boolean { TEST stack kosong : Mengirim true, jika tumpukan kosong, false jika tumpukan tidak kosong} Deklarasi Deskripsi return (Top (S) = Nil) 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 Top (S) Nil 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 alamatnya dan yang kedua menambahkan suatu nilai ElmtS yang diberikan. 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) TOP (S) P 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) TOP(S) P 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 . Prosedur pertama mengambil suatu Elmts dengan menyimpan alamatnya dan yang kedua mengambil nilai , dan membebaskan alamat ( dealokasi ) yang tadinya dipakai. 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) TOP (S) Next(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) TOP (S) Next(TOP(S)) Dealokasi (P)

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? 3. Penghapusan elemen pada Stack selalu dilakukan pada elemen yang paling atas, bagaimana jika terpaksa harus menghapus elemen yang paling bawah? 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 8. Buatlah sebuah fungsi untuk mengirimkan elemen Stack yang maksimum jika diketahui elemen Stack terurut mengecil bertype integer 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 3. Satu elemen dengan elemen lain dapat diakses melalui informasi Next 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 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 : Head(Q) Tail(Q) Next(P) Info(P)

Bagian Deklarasi dari algoritma pada Queue : Deklarasi type InfoType = ,Sebuah type terdefinisitype Address pointer to ElmtQ type ElmtQ = record type Queue = record {Deklarasi Nama Peubah} Q : Queue P : Address 6.2. Travesal pada Queue 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.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 melakukan test terhadap Queue sebagai berikut :Halaman 95 function IsQEmpty (Q : Queue) Boolean { TEST Queue kosong : Mengirim true, jika antrian kosong, false jika antrian tidak kosong} Deklarasi Deskripsi return ((Head(Q) = Nil) and (Tail(Q) = Nil))Halaman 96 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 Head(Q) Nil Tail(Q) NilHalaman 97 c.Penambahan sebuah elemen pada Queue Penambahan selalu dilakukan pada ekor, dan karena alamat ekor diketahui maka prosesnya sederhana, yaitu hanya InsertLast. Berikut ini akan diberikan skema prosedur penyisipan tersebut. Halaman 98 Realisasi algoritma dari definisi fungsional ini adalah salah satu dari dua buah prosedur yang melakukan penambahan elemen Queue sebagai berikut : Prosedur pertama menambahkan suatu Elemen Queue yang diketahui alamatnya dan yang kedua menambahkan suatu nilai Elemen queue yang diberikan.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 } DeklarasiHalaman 100 Deskripsi If IsQEmpty(Q) then Head(Q) P

Tail(Q) P else Next(Tail(Q)) P Tail(Q) P endifHalaman 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 } DeklarasiHalaman 102 Deskripsi Alokasi (P) Info (P) E If IsQEmpty(Q) then Head(Q) P Tail(Q) P else Next(Tail(Q)) P Tail(Q) P endifHalaman 103 d. Penghapusan Elemen Pada QueuE Penghapusan elemen pada queue selalu dilakukan pada elemen pertama, hanya saja perlu diperhitungkan bahwa mungkin queue menjadi kosong akibat terjadinya penghapusan. Jika queue menjadi kosong, maka harga Tail harus diganti. Jika akibat penghapusan queue tidak kosong, maka elemen terakhir tidak berubah. Halaman 104 Berikut adalah skema penghapusan tersebut. Prosedur pertama melakukan penghapusan ElmtQ yang berada di Head danyang dicatat adalah alamatnya, yaitu P. Prosedur yang kedua menghapus elemen Head dari queue dan menyimpannya pada suatu elmtQ serta membebaskan alamat yang tadinya dipakai oleh elemen Head tersebut.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 } Deklarasi DeskripsiHalaman 106 P Head(Q) Head(Q) Next(Head(Q)) if (Head(Q) = Nil) then Tail(Q) Nil endif Next(P) NilHalaman 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 } Deklarasi DeskripsiHalaman 108 P Head(Q) E Info(Head(Q)) Head(Q) Next(Head(Q)) if (Head(Q) = Nil) then Tail(Q) Nil endif Next(P) Nil Dealokasi(P)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 dilakukan pada elemen yang paling depan, bagaimana jika terpaksa harus menghapus elemen yang paling belakang?Halaman 110 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 8. Buatlah sebuah fungsi untuk mengirimkan elemen queue yang maksimum jika diketahui elemen queue terurut membesar dan bertype integerHalaman 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 2. Elemen yang lain (jika masih ada) dibagibagi menjadi beberapa sub himpunan yang disjoint dan masing-masing sub himpunan tersebut adalah pohon yang disebut sebagai sub pohon dari pohon tersebut.Halaman 112 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 Cabang adalah hubungan antara Akar dengan sub pohonHalaman 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 Daun adalah simpul terminal dari pohon. Semua simpul selain Daun adalah simpul bukan terminalHalaman 114 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 1 disebut pohon 1-aire/uner 2 disebut pohon 2-aire/binerHalaman 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. Dua buah simpul disebut sebagai Sepupu jika mempunyai tingkat yang sama dalam sebuah pohon.Halaman 116 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 Lebar sebuah Pohon adalah maksimum banyaknya simpul yang ada pada suatu Tingkat (Level)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) dan Sub Pohon Kanan (Right) dari pohon biner tersebut.Halaman 118 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. Istilah-istilah yang digunakan sama dengan istilah pada pohon secara umum.Halaman 119 Notasi Prefiks, Infiks dan Postfiks 1. Notasi Prefiks Notasi Prefiks ditulis dengan cara mengikuti alur sebagai berikut :Halaman 120 2. Notasi Infiks Notasi ini ditulis dengan cara mengikuti alur sebagai berikut :Halaman 121 3. Notasi Posfiks Notasi ini ditulis dengan cara mengikuti alur sebagai berikut :Halaman 122 Rekonstruksi Algoritma {Deklarasi Type} Type Infotype = ,terdefinisiType node = record Type BinTree : address {Primitif}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 {Mengirimkan anak kanan pohon biner P}Halaman 124 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 Proses : Menghasilkan sebuah pohon biner dari Akar, L dan R}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 K. AKHIR : Semua simpul P sudah diproses secara inorder}Halaman 126 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 K. AKHIR : Semua simpul P sudah ditulis dengan 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 {Mengirimkan banyaknya elemen (node) pohon biner P}Halaman 128 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 kosong P adalah pohon unerright yaitu hanya mempunyai sub pohon kanan}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 pohon condong kanan}Halaman 130 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} {Operasi Lain}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 sebagai anak kanan X (jika not kiri)}Halaman 132 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) {K. AWAL : P tidak kosong, X adalah salah satu daun K. AKHIR : X dihapus dari P}