STRUKTUR DATA
1. Pembahasan Materi
- Stack
- Queue
- Linked list
- Sorting
2. Contoh Program
STACK / Tumpukan
Stack atau tumpukan adalah struktur data dimana semua penyisipan dan penghapusan
data hanya dilakukan melalui satu pintu saja yang disebut Top Stack. Tumpukan atau stack dapat
dikatakan sebagai struktur yang bersifat (Last In Frist Out).
1. Push
Oprasi push adalah menambah elemen kedalam stack S, dimana penambahan dapat
dilakukkan jika stack itu belum penuh. {stack dikatakan penuh jika posisi atas sudah
brada pada posisi N (if S. atas = N then stack is full)}
Prosedur Push
x = tipe data
S = Stack
If s atas < n then
S atas = s atas + 1
S isi [ s atas ] = x
Else
Atas = 0
Stack sudah penuh
Stack s
Prosedur Push
x = tipe data
S = Stack
If s atas < n then
S atas = s atas + 1
S isi [ s atas ] = x
Else Atas = 1
Stack sudah penuh
Stack s
Prosedur Push
x = tipe data
S = Stack
If s atas < n then
S atas = s atas + 1
S isi [ s atas] = k
Else Atas = 1
Stack sudah penuh
Stack s
Prosedur Push
x = tipe data
S = Stack
If s atas < n then
S atas = s atas + 1
Atas =2
S isi [s atas]= x
Else
Stack sudah penuh
Stack s
Prosedur Push
x = tipe data
S = Stack
If s atas < n then
S atas = s atas + 1
S isi [ s atas] = k Atas =2
Else
Stack sudah penuh
Stack s
Prosedur Push
x = tipe data
S = Stack
If s atas < n then
S atas = s atas + 1 Atas =3
S isi [ s atas] = x
Else
Stack sudah penuh
Stack s
Prosedur Push
x = tipe data
S = Stack
If s atas < n then
S atas = s atas + 1 Atas =3
S isi [ s atas] = k
Else
Stack sudah penuh
Stack s
Prosedur Push
x = tipe data
S = Stack Atas =5
If s atas < n then
S atas = s atas + 1
S isi [ s atas] = k
Else
Stack s
2. Pop
Pop adalah menghapus elemen dari stack, dimana elemen yang dihapus adalah elemen
yang terakhir masuk LIFO (Last in first out) atau elemen penghapusan dimana proses
penghapusan dapat dilakukan jika stack tidak dalam keadaan kosong. { if s atas >0 then
stack tidak kosong }. Dimana setiap penghapusan, maka posisi yang paling atas akan
berkurang 1 ( s atas = s atas – 1).
Prosedur Pop
If s atas >0 then
Write s isi [s atas]
S atas = s atas – 1
Else
Stack kosong
Prosedur Pop
if s atas > 0 then Atas =5
write s isi [s atas]
s atas = s atas - 1
else
stack kosong
Stack s
Prosedur Pop
if s atas > 0 then
write s isi [s atas] Atas = 4
s atas = s atas - 1
else
stack kosong
Stack s
Prosedur Pop
if s atas > 0 then
write s isi [s atas] Atas = 4
s atas = s atas - 1
else
stack kosong
Stack s
Prosedur Pop
if s atas > 0 then
write s isi [s atas] Atas = 3
s atas = s atas - 1
else
stack kosong
Stack s
Prosedur Pop
if s atas > 0 then
write s isi [s atas]
s atas = s atas - 1
else
stack kosong
Atas = 0
Stack s
Oprasi-oprasi / Fungsi Stack
- Init : digunakan untuk inisialisasi atau membuat stack baru yang masih
kosong.
- Push : digunakan untuk menambah item pada stack pada tumpukan paling atas
- Pop : digunakan untuk mengambil item pada stack pada tumpukan paling atas
- Clear : digunakan untuk mengosongkan stack
- IsEmpty : digunakan untuk mengecek apakah stack sudah kosong
- IsFull : digunakan untuk mengecek apakah stack sudah penuh
Inisialisasi Stack
- Isi top degan -1 karena array dalam c dimulai dari 0, yang berarti stack adalah kosong
- Top adalah sautu variable penanda dalam stack yang menunjukkan elemen teratas stack
sekarang. Top of stack akan selalu bergerak hingga mencapai max of stack sehingga
menyebabkan stack penuh !
4 Max _ Stack
3
2 Void inisialisasi ( )
{
1
Tumpuk Top = -1 ;
0 }
Top = - 1
- Fungsi IsFull
1. Untuk Memeriksa apakah stack sudah penuh.
2. Dengan cara memeriksa top of stack, jika sudah sama dengan max_stack -1 maka
full, jika belum / masih lebih kecil dari max_stack -1 maka belum full
- Fungsi IsEmpty
1. Untuk memeriksa apakah stack masih kosong
2. Dengan cara memeriksa top of stack, jika masi -1 maka berarti stack masih kosong
int IsEmpty ( )
{
if (tumpuk.top == -1 )
Return 1 ;
else
Return 0;
}
- Fungsi Clear
1. Untuk mengosongkan stack
2. Stack akan dianggap kosong bila ujung atas stack pada posisi - 1
Void clear ( )
{
tumpuk.top == -1;
printf (“Stack telah dikosongkan \n”);
Queue adalah suatu kumpulan data yang mana penambahan elemen hanya bisa dilakukan
pada satu ujung (disebut dengan sisi belakang atau rear) dan penghapusan dan pembembalian
elemen dilakkukan lewat ujung lain (disebut sisi belakang atau front), antrian menggunkan
prinsip pertama masuk pertama keluar First out (FIFO). Dengan kata lain urutan masuk sama
dengan urutan keluar.
Queue atau antrian banyak kita jumpai dalam kehidupan sehari-hari, seperti : antrian tiket
mobiil, antrian mahasiswa dan lain lain . contoh lain dalam bidang computer adalah pemakaian
system computer berbagi waktu (time sharing computer system) dimana ada sejumlah pemakai
yang akan menggunakan system tersebut secara serempak.
Pada queue atau antrian terdapat satu buah pintu masuk di suatu ujung dan satu buah
pintu keluar di ujung satunya dimana membutuhkan variable head dan tail (depan/front,
belakang/rear)
Operasi Queue :
1. Create ( )
Untuk menciptakan dan menginisialisasikan Queue, dengan cara membuat Head
dan Tail = -1
Deklarasi Queue
#define MAX 8
Typedef struct
{
int data [MAX];
int head;
int tail;
}
Queue;
Queue antrian ;
0 1 2 3 4 5 6 7 MAX =8
Void create ( ) {
Antrian. Head = antrian.tail = -1 }
2. IsEmpty ( )
Untuk memeriksa apakah antrian suah penuh atau belum dengan cara memeriksa
nilai Tail, jika Tail = -1 maka empty kita tidak memeriksa Head, Karena Head adalah
tanda untuk kepala antian (elemen pertama dalam antrian ) yang tidak akan berubah-
ubah. Pergerakan pada antrian terjadi dengan penambahan elemen antrian kebelakang,
yaitu menggunakan nilai Tail.
0 1 2 3 4 5 6 7 MAX =8
Antrian pertama kali
Head = -1 Karena Tail = -1
Tail = -1
Int IsEmpty ( ) {
If (antrian .tail== -1 }
return 1 ;
Else
Return 0;
}
3. IsFull
Untuk mengecek apakah antrian sudah penuh atau belum dengan cara mengecek
nili Tail, jika Tail > = MAX -1 (Karena MAX -1 adalah batas elemen array pada C )
berarti sudah penuh
4 45 1 8 5 12 7 78
0 1 2 3 4 5 6 7 MAX =8
Antrian pnuh karena
Head = 0 Tail = MAX -1 Tail = 7
Int IsFull ( ) {
If (antrian .tail== MAX -1 }
return 1 ;
Else Return 0;
}
4. Enqueue
Untuk menambahkan elemen ke dalam antrian, penambahan elemen selalu
ditambahkan di elemen paling belakang. Penambahan elemen selalau menggerakan
variable Tail dengan cara increment conter Tail terlebih dahulu.
4 45 1 8
0 1 2 3 4 5 6 7 MAX =8
Head = 0 Tail = 2 Tail = 3 Equeue(8)
Void Equeue (int data) {
If (Empty ( ) == 1 ) {
Antrian.head=antrian.tail=0;
Antrian.data [antrian.tail]= data;
Print (“%d masuk!”,antrian.data [antrian.tail] );
}else
If(IsFull( ) ==0){
Antrian.tail ++;
Antrian.data[antrian.tai]=data;
Printf(“%d masuk !”, antrian.data[antrian.tail]);
}
}
5. Dequeue
Digunakan untuk menghapus elemen terdepan/pertama (head) dari antrian dengan
cara mengeser semua elemen antrian kedepan dan mengurangi Tail dengan 1 pergeseran
dilakukan dengan menggunakan looping.
4 45 1 8
0 1 2 3 4 5 6 7 MAX =8
45 1 8
0 1 2 3 4 5 6 7
MAX =8
Head = 0 Tail =2
Maju semua tail
Int Dequeue ( ) {
Int i ;
Int e = antrian.data [antrian.head];
For (i = antrian.head d; i <=antrian.data [i +1];
}
antrian.tail --;
return e;
}
6. Clear ( )
Untuk menghapus elemen-elemen antrian dengan cara membuat Tail dan Head =
-1 penghapusan elemen-elemen antrian sebenarnya tidak menghapus arraynya, namun
hanya mengeset indeks pengaksesan nya ke nilai -1 sehingga elemen antrian tidak lagi
terbaca.
4 45 1 8
0 1 2 3 4 5 6 7 MAX =8
Head = 0
Tail = -1 Void Clear () {
{
Antrian.head=antrian.tail= -1;
Printf (“data clear”);
}
7. Tampilan ( )
Untuk menampilkan nilai-nilai elemen antrian menggunakan looping dari head
s/d tail
Void Tampil ( )
{
If (IsEmpty ( ) == 0) {
For (int i =antrian.head; i <=antrian.tail; i ++ ) {
Printf (“%d “, antrian.data [i]);
}
} else printf (“data kosong !\n”) ;
}
Linked list adalah bentuk sederhana, yang merupakan sekumpulan nod yang bersama-sama
membentuk sebuah urutan linier. Setiap node akan meyimpan sebuah pointer yang disebut degan
Next, yang menunju node berikutnyya pada list.
FIRST head
LAST tail
1 2 3 4
Node pertama dalam sebuah list disebut sebagai head. Node terakhir dari sebuah list disebut
dengan tail.
FIRST head
LAST tail
1 2 3 4
Keterangan ;
1. Pada gambar di atas terdapat 4 node / simpul. Simpul 1, 2, 3 dan 4.
2. Setiap simpul memiliki 2 elemen (field) yaitu;
Info = menyimpann data atau informasi dan memiliki tipe data, pada contoh di atas
memiliki tipe data integer.
Link= bertipe pointer, menyimpan alamat simpul berikutnya.
Contoh ;
Simpul no. 1
Info= 25
Link=alamat ke simpul nomor 2
3. Simpul no 1 ditunjuk oleh pointer First dan disebut Head, simpul nomor 4 ditunjuk oleh
ponter Last dan sebut Tail.
Pada sebuah simpul terdapat 2 bua field yaitu, Info dan Pointer Link (*Link).
Membutuhkan 3 pointer yaitu ;
- *P = menyimpan atau menunjuk alamat node yang diproses saat ini
- *First = menyimpan atau menunjuk alamat dari simpul pertama
- *Last = menyimpan atau menunjuk alamat dari simpul terakhir.
- Sintak ;
First=NULL;
First=NULL berarti pinter First akan berisi NULL (\0)
- Ilustrasi
- Pembuatan simpul
- Ilustrasi
3. Membuat simpul
Menjadikan sebuah simpul menjadi simpul awal dari sebuah linked list.
Simpul awal ditunjuk oleh pointer FIRST.
- Fungsi :
Void AWAL(void)
{
if(FIRST==NULL)
{
FIRST=P;
LAST=P;
P->LINK=NULL;
}
else
cout<<”Linked List sudah ada””<<endl;
}
- lustrasi :
Sudah dibuat simpul sbb:
FIRST=P
LAST=P atau
LAST=FIRST
P->LINK=NULL atau
FIRST->LINK=NULL atau
LAST->LINK=NULL
- Fungsi :
- Ilustrasi
Sudah ada linked list
LAST->LINK=P atau
FIRST->LINK=P
LAST=P atau
LAST=FIRST->LINK
P->LINK=NULL atau
LAST->LINK=NULL atau
FIRST->LINK->LINK=NULL
# Insert Kiri
- Fungsi
- Ilustrasi
Sudah ada linked list
P->LINK=FIRST atau
P->LINK=LAST
FIRST=P
# Insert Tengah
Menyisipkan sebuah simpul antara dua buah simpul pada linked list.
Q=FIRST;
For(i=1;i<=6;i++)
Q=Q->LINK;
- Fungsi :
Void INSERT_TENGAH(void)
{
{
P->LINK=Q->LINK;
Q->LINK=P;
}
- Ilustrasi :
P->LINK=Q->LINK
Q->LINK=P
# Delete Kanan/Akhir
Menghapus simpul yang ada pada linked list paling akhir/kanan.
Ilustrasi
Ilustrasi :
free(LAST)
LAST = Q
Ilustrasi :
sudah ada sebuah linked list
Fungsi :
void DELETE_KIRI(void)
{
Q = FIRST;
FIRST = Q -> LINK;
free(Q);
}
Ilustrasi
Q = FIRST
free(Q)
# Delete Tengah
Ilustrasi :
Syarat agar simpul no.7 bisa dihapus maka simpul no.6 harus sudah
ditunjukoleh Q.
Caranya :
Q = FIRST;
For(I = 1; I <= 5; I++)
Q = Q -> LINK;
Fungsi :
void DELETE_TENGAH(void)
{
R = Q -> LINK;
Q -> LINK = R -> LINK;
free(R);
}
lustrasi
R = Q -> LINK
Q -> LINK = R -> LINK
free(R)
Tree merupakan salah satu bentuk struktur data tidak linear yang menggambarkan
hubungan yang bersifat hirarkis (hubungan one to many) antara elemen-elemen. Tree bisa
didefinisikan sebagai kumpulan simpul/node dengan satu elemen khusus yang disebut Root
dan node lainnya. Tree juga adalah suatu graph yang acyclic, simple, connected yang tidak
mengandung loop.
Sebuah binary search tree (bst) adalah sebuah pohon biner yang boleh kosong, dan setiap
nodenya harus memiliki identifier/value. Value pada semua node subpohon sebelah kiiri
adalah selalu lebih kecil dari value dari root, sedangkan value subpohon di sebelah kanan
adalah sama atau lebih besar dari value pada root, masing-masing subpohon tersebut (kiri dan
kanan) itu sendiri adalah juga binary search tree.
Struktur data bst sangat penting dalam struktur pencarian, misalkan dalam kasus
pencarian dalam sebuah list, jika list sudah dalam keadaan terurut maka proses pencarian akan
semakin cepat, jika kita menggunakan list contigue dan melakukan pencarian biner,akan
tetapi jika kita ingin melakukan perubahan isi list (insert atau delete), menggunakan list
contigue akan sangat lambat, karena prose insert dan delete dalam list contigue butuh
memindahkan linked-list, yang untuk operasi insert atau delete tinggal mengatur- atur
pointer,akan tetapi pada n-linked list, kita tidak bisa melakukan pointer sembarangan setiap
saat, kecuali hanya satu kali dengan kata lain hanya secara squential.
Binary Tree merupakan salah satu bentuk struktur data tidak linear yang
menggambarkanhubungan yang bersifat hirarkis (hubungan one to many) antara elemen-
elemen. Tree bisa didefinisikan sebagai kumpulan simpul/node dengan satu elemen khusus
yang disebut Root dan node lainnya ( disebut subtree).
Dalam tree terdapat jenis-jenis tree yang memiliki sifat khusus, diantaranya adalah binary
tree.
Binary tree adalah suatu tree dengan syarat bahawa tiap node (simpul) hanya boleh
memiliki maksimal dua subtree dan kedua subtree tersebut harus terpisah. Tiap node dalam
binary treee boleh memiliki paling banyak dua child (anak simpul), secara khusus anaknya
dinamakan kiri dan kanan.
Binary Tree merupakan himpunan vertex-vertex yang terdiri dari 2 subtree (dengan
disjoint) yaitu subtree kiri dan subtree kanan. Setiap vertex dalam binary tree mempunyai
derajat keluar max = 2.
Sebuah pohon biner adalah grafik asiklis yang terhubung dimana setiap tingkatan dari
susut tidak lebih dari 3. Ini dapat ditunjukkan bahwa dalam pohon biner manapun, terdapat
persis dua atau lebih simpul dengan tingkat satu daripada yang terdapat dengan tingkat tiga,
tetapi bisa terdapat angka apa saja dari simpul dengan tingkat dua. Sebuah pohon biner
berakar merupakan sebuah grafik yang mempunyai satu dari sudutnya dengan tingkat tidak
lebih dari dua sebagai akar.
Dengan akar yang dipilih, setiap sudut akan memiliki ayah khusus, dan diatas dua anak
bagaimanapun juga, sejauh ini terdapat keterbatasan informasi untuk membedakan antara
anak kiri atau kanan. Jika kita membuang keperluan yang tak terkoneksi, membolehkan
bermacam koneksi dalam komponen di grafik, kita memanggil struktur sebuah hutan.
Sebuah jalan lain untuk mendefinisikan pohon biner melalui definisi rekursif pada grafik
langsung. Sebuah pohon biner dapat berarti :
Pohon biner dapat dikontruksi dari bahasa pemrogaraman primitif dalam berbagai cara.
Dalam bahasa yang menggunakan records dan referensi. Pohon biner secara khas dikontruksi
dengan mengambil sebuah struktur simpul pohon yang memuat beberapa data dan referensi
ke anak kiri dan anak kanan.
Kadang-kadang itu juga memuat sebuah referensi ke ayahnya yang khas. Jika sebuah simpul
mempunyai kurang dari dua anak, beberapa penunjuk anak diaatur kedalam nilai nol khusus
atau kesebuah simpul sentinel.
Pohon biner dapat juga disimpan sebagai struktur data implisit dalam array, dan jika pohon
tersebut merupakan sebuah pohon biner lengkap, metode ini tidak boros tempat. Dalam
penyusunan yang rapat ini, jika sebuah simpul memiliki indeks i, anaknya dapat ditemukan
pada indeks ke-2i+1 dan 2i+2, meskipun ayahnya (jika ada) ditemukan pada indeks lantai ((i-
1)/2) (asumsikan akarnya memiliki indeks kosong). Metode ini menguntungkan dari banyak
penyimpanan yang rapat dan memiliki referensi lokal yang lebih baik, teristimewa selama
sebuah preordeer traversal.
Semua simpul (kecuali daun) memiliki 2 anak dan tiap cabang memiliki panjang ruas yang
sama.
Hampir sama dengan Pohon BinerPenuh, semua simpul (kecualidaun) memiliki 2 anak tetapi
tiap cabang memiliki panjang ruas berbeda.
c. Pohon Biner Similer
Dua pohon yang memiliki struktur yang sama tetapi informasinya berbeda.
Dua pohon yang semua simpulnya mempunyai satu anak / turunan kecuali daun.
2 (N) - 1
N
∑ 2 ( I – 1)
I=1
- Bubble Sort,
- Insertion Sort,
- Selection Sort
- Quick Sort.
1. Bubble Sort
Bubble = busa/udara dalam air –apa yang terjadi?Busa dalam air akan naik ke atas. Mengapa?
Ketika busa naik ke atas, maka air yang di atasnya akan turun memenuhi tempat bekas busa
tersebut.
Pada setiap iterasi, bandingkan elemen dengan sebelahnya: yang busa naik, yang air turun!
Tehnik Sort yg bekerja dgn menggunakan prinsip gelembung (bubble) udara yg akan bergerak
naik ke atas secara satuper satu.
2. Selection Sort
Ambil yang terbaik (select) dari unsorted list, tambahkan di belakang sorted list.
Lakukan terus sampai unsorted list habis.
Tehnik pengurutan dgn cara pemilihan elemen atau proses kerja dgn memilih elemen data
terkecil utk kemudian dibandingkan & ditukarkan dgn elemen pd data awal, dst s/d seluruh
elemen shg akan menghasilkan pola data yg telah disort.
3. Bandingkan data ke-I tersebut dengan data sebelumnya (I-1), Jika lebih kecil maka data
tersebut dapat disisipkan ke data awal sesuai dgn posisisi yg seharusnya
4. Lakukan langkah 2 dan 3 untuk bilangan berikutnya ( I= I+1 ) sampai didapatkan urutan
yg optimal.
Contoh :
4. Marge Sort
MergeSort adalah algoritma yang berdasarkan strategi divide-and-conquer. Algoritma ini
tediri dari dua bagian utama, yaitu bagian pembagian list menjadi sublist-sublist yang lebih kecil
dan bagian sort (pengurutan) dan merge (penggabungan) pada sublist-sublist tersebut.
1) Divide: membagi masalah menjadi beberapa submasalah yang memiliki kemiripan
dengan masalah semula namun berukuran lebih kecil (idealnya berukuran hampir
sama),
2) Conquer: memecahkan (menyelesaikan) masing-masing submasalah (secara rekursif), dan
3) Combine: mengabungkan solusi masing-masing submasalah sehingga membentuk solusi
masalah semula.
Contoh :
5. Quick Sort
Sort dgn iterasi secara urut dr posisi elemen 1, ke-2 dstnya. Tukarkan setiap elemen pd
posisi tsb dgn elemen lain yangg nilainya memang seharusnya berada pada posisi tersebut.
1. Tentukan Lower Bound (Batas Bawah) & Upper Bound (Batas Atas)
4. Jika LB =< UB, maka Next Upper Bound & Lower Bound