STRUKTUR DATA
:: Fetty Tri Anggraeny ::
Tentang Saya
Fetty Tri Anggraeny, S.Kom
HP : (031)83031803
Email :
fetty@upnjatim.ac.id atau fetty_ta@yahoo.com
MK :
Bahasa Pemrograman,
Struktur Data,
Sistem Digital,
Grafika Komputer
Pengolahan Citra Digital
Sistem Pakar atau Sistem Berbasis Pengetahuan
KONTRAK KULIAH
Toleransi keterlambatan 30 menit terhitung
mulai pukul 10.00, berlaku bagi dosen dan
mahasiswa
Pakaian SOPAN, berkerah, bebas rapi dan
bersepatu.
NILAI :
Tugas dan quiz
Final Project (Tim)
UTS
: 20 %
: 20 %
: 30 %
UAS
: 30 %
POIN PLUS :keaftifan dalam kelas maupun tugas
MATERI KULIAH
Fungsi Rekursi
Review : Array, Struct, Pointer
Sorting
Searching
Linked List
Stack
Queue
Graph dan Tree
Satuan Acara Perkuliahan
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Pengantar + Fungsi Rekursi 1
Fungsi Rekursi 2
Review Array dan Struct
Sorting 1 : Bubble dan Insertion
Sorting 2 : Selection
Searching
Review Pointer
UTS
Linked List 1 : Single Linked List
Linked List 2 : Linked List Lanjut
Stack 1 – Operasi Dasar
Stack 2 – Contoh Penggunaan
Queue
Graph
Tree
UAS
Buku Referensi
Data Structures Using C and C++
2nd edition, Yedidyah Langsam, dkk
Text book lain
Internet www.google.com
What is programming?
PROGRAM = ALGORITMA + STRUKTUR
DATA
ALGORITMA :
SEQUENTIAL
BRANCHING
LOOPING/
REKURSI
STRUKTUR DATA :
ARRAY
STRUCT
POINTER
ADT : LINKED
TREE, DLL
LIST, STACK, QUEUE, GRAPH,
MINGGU
PERTAMA
Fungsi Rekursif
Definisi fungsi rekursif.
Contoh 1 : Faktorial
Contoh 2 : Perkalian
Contoh 3 : Fibonacci
Contoh 4 : Tower of Hanoi
Fungsi Rekursif
A
Fungsi biasa dipanggil oleh fungsi lain.
Sedangkan fungsi rekursif dipanggil oleh
dirinya sendiri.
B
C
D
A
A
A
A
Fungsi Rekursif
Setara dengan proses looping/ iterasi
faktorial, perkalian
Kadang rekursif lebih baik dari iterasi
tower of hanoi
Terkadang sebaliknya fibonacci
Komponen :
out if – else + return()
Recursive call dengan value baru
Way
Simple Example
#include<stdio.h>
int main(void)
{
printf("Never ends\n");
main();
return 0;
}
Faktorial
ALGORITMA
SOURCE CODE
n! = 1 if n == 0
n! = n * ( n – 1 )! if n > 0
4! = 4 x 3!
3! = 3 x 2!
2! = 2 x 1!
1! = 1 x 0!
0! = 1
int factorial ( int n )
{
int x, y;
if ( n == 0 ) return ( 1 );
x = n – 1;
y = factorial ( x );
return ( n * y );
}
Latihan tracing rekursi
Perkalian
ALGORITMA
SOURCE CODE
a * b = a if b == 1
a * b = a * ( b – 1 ) + a if b > 1
6x3=(6x2)+6
=(6x1)+6+6
=6+6+6
= 18
int mult ( int a, int b )
{
int c, d, sum;
if ( b == 1 ) return ( a );
c = b – 1;
d = mult ( a, c );
sum = d + a;
return ( sum );
}
Latihan tracing rekursi
Minggu Kedua
Fibonacci
The Fibonacci series fn≥0 is a famous
series defined by:
f0 :≡ 0, f1 :≡ 1, fn≥2 :≡ fn−1 + fn−2
f2 = f0 + f1 = 0 + 1 = 1
f3 = f1 + f2 = 1 + 1 = 2
f4 = f2 + f3 = 1 + 2 = 3
f5 = f3 + f4 = 2 + 3 = 5
….
Leonardo Fibonacci
1170-1250
Fibonacci
ALGORITMA
fibo( n ) = n if n == 0 or n == 1
fibo( n ) = fibo(n – 2) + fibo( n – 1 ) if n >= 2
fibo( 4 ) = fibo( 3 ) + fibo( 2 )
= fibo( 2 ) + fibo ( 1 ) + fibo( 2 )
= fibo(1) + fibo(0) + fibo(1) + fibo(2)
= 1 + fibo(0) + fibo(1) + fibo(2)
= 1 + 0 + fibo(1) + fibo(2)
= 1 + fibo(1) + fibo(2)
= 1 + 1 + fibo(2)
= 2 + fibo(2)
= 2 + fibo(1) + fibo(0)
= 2 + 1 + fibo(0)
=2+1+0
=2+1
=3
SOURCE CODE
int fibo ( int n )
{
int x, y;
if ( n <= 1 ) return ( n );
x = fibo ( n – 1);
y = fibo ( n – 2);
return ( x + y );
}
Tracing Fibonacci
F(4)
fibo (4) = ?
2+1=3
1+0=1
1+1=2
F(2)
F(3)
1+0=1
1
F(1)
F(2)
1
F(1)
F(0)
0
1
0
F(1)
F(0)
Towers of Hanoi
ALGORITMA
1. If n == 1, move the single disk from A to C and stop.
2. Move the top n – 1 disks from A to B, using C as auxiliary.
3. Move the remaining disk from A to C.
4. Move the n – 1 disks from B to C, using A as auxiliary.
SOURCE CODE
void towers( int n, char from, char to, char aux)
{
if ( n == 1 ) {
printf(“\nmove disk 1 from %c to %c”, from, to); return;
}
towers( n – 1, from, aux, to );
printf(“\nmove disk %d from %c to %c”, n, from, to);
towers( n – 1, aux, to, from );
}
Tracing Towers of Hanoi
towers(3, A, C, B) = ?
Tugas Rumah : TRACING
towers(4, A, C, B) = ?
fibo(6) = ?
factorial(5)=?
mult(3,5)=?
Minggu Ketiga
Array dan Struct
Review struktur data dasar
Array
Struct
Contoh analisa program
ARRAY
Tipe data turunan.
Contoh deklarasi : int x[20];
SATU variabel untuk menyimpan BANYAK
data dengan TIPE data yang SAMA.
Mempunyai INDEKS.
4
3
2
1
7
Struktur data :
Alokasi memori bersifat statis/ tetap.
Konsep : string, array multidimensi
Contoh program
Program menghitung rata-rata nilai.
Algoritma :
Deklarasikan variabel array untuk menyimpan
data-data nilai.
Input data nilai dengan perintah looping.
Akses elemen dengan operator kurung siku
([]).
Hitung penjumlahan data-data nilai.
Hitung rata-rata = jumlah total/ jumlah data.
STRUCT
Tipe data turunan.
Contoh deklarasi :
struct {
int jari_jari;
float luas;
float keliling;
} lingkaran;
STRUCT Contd.
SATU variabel bisa menyimpan BANYAK
data yang BERBEDA TIPE datanya.
Mempunyai ELEMEN.
10
Struktur data :
314.0
62.8
Konsep : struct of struct (nested struct).
Contoh program
Program tentang lingkaran.
Algoritma :
Inventarisasi
atribut-atribut yang dimiliki oleh
sebuah objek lingkaran.
Akses masing-masing elemen dengan
memakai operator tanda titik (.).
ARRAY OF STRUCT
Struktur data berupa array yang setiap
elemennya bertipe struct.
Contoh deklarasi :
struct {
int NPM;
char nama[30];
float IPK;
} mhs[100];
Array of Struct Contd.
Struktur data :
100
101
102
103
Abdullah
Budi
Candra
Daud
3.80
3.45
3.22
3.17
Untuk akses elemen dimulai dari indeks
array kemudian diikuti nama elemennya
mhs[3].NPM = 1234;
Contoh Program
Program data mahasiswa.
Program tabel fungsi kuadrat.
Minggu Keempat
Sorting
Tujuan : memahami proses tracing
algoritma pengurutan.
Beberapa jenis algoritma sorting :
Bubble
sort
Selection sort
Insertion sort
Bubble Sort
void bubble ( int X [ ], int n )
{
int hold, j, pass;
for ( pass = 0; pass < n-1; pass++)
for ( j = 0; j < n-pass-1; j++)
if ( X[j] > X[j+1] )
{
hold = X[j];
X[j] = X[j+1];
X[j+1] = hold;
}
}
Insertion Sort
void insertion ( int X [ ], int n )
{
int i, k, y;
for ( k = 1; k < n; k++)
{
y = X[k];
for ( i = k-1; i >= 0 && y < X[i]; i--)
X[i+1] = X[i];
X[i+1] = y;
}
}
Minggu Kelima
Kuis kecil
void urutkan ( int X [ ], int n )
{
int temp, i, j;
i=0;
while(i<n-1){
for ( j = 0; j < n-i-1; j++){
temp = X[j+1];
if ( X[j] < X[j+1] ){
X[j+1] = X[j];
X[j] = temp;
}
}
i++;
}
}
Selection Sort
void selection ( int X [ ], int n )
{
int i, j, index, large;
for ( i = n-1; i > 0; i--)
{
large = x[0];
index = 0;
for ( j = 1; j <= i; j++)
if ( X[j] > large )
{
large = X[j];
index = j;
}
X[index] = X[i];
X[i] = large;
}
Tugas :
Algoritma dan contoh sortingnya :
Quick
Sort
Merge Sort
Shell Sort
Minggu Keenam
Searching
Tujuan : memahami algoritma pencarian.
Jenis algoritma searching :
Sequential
search
Indexed sequential search
Binary search
Sequential Search
int SequentialSearch(int key, int data[], int n)
{
int i;
for (i = 0; i < n; i++)
if (key == data[i])
return (i);
return (-1);
}
Indexed Sequential Search
int IndexSequential( int key, int k[], int n, int kindex[], int pindex[], int indxsize )
{
int i, j, lowlim, hilim;
for ( i = 0; i < indxsize && kindex[ i ] <= key; i++ );
if ( i == 0 )
lowlim = 0;
//set lowlim
else
lowlim = pindex[i-1];
if ( i == indxsize )
hilim = n – 1;
//set hilim
else
hilim = pindex[i] – 1;
for ( j = lowlim; j <= hilim && k[ j ] != key; j++ );
if ( j > hilim )
return (-1);
else
return ( j );
}
Latihan tracing
Binary Search
int BinarySearch(int key, int data[], int n)
{
int low, high, middle
low = 0;
high = n – 1;
while (low <= high)
{
middle = (low + high)/2;
if (key == data[middle]
return(middle);
if (key < data[middle]
high = middle – 1;
else
low = middle + 1;
}
return(-1);
}
Latihan tracing
Minggu Ketujuh
POINTER
Adalah TIPE DATA TURUNAN
Contoh deklarasi : int *pointerX;
Variabel bertipe pointer digunakan untuk
menyimpan ALAMAT sebuah data,
BUKAN NILAI datanya.
Operator yang sering dipakai:
mendapatkan alamat memori
* mengakses nilai dari sebuah pointer
&
#include “stdio.h”
void main()
{
int data, *pointer_data;
data = 100;
pointer_data = &data;
printf(“Data = %d di alamat %p\n”,
data, pointer_data);
}
POINTER KE ARRAY
#include “stdio.h”
void main()
{
int data[5] = {2,4,3,1,5};
int *pdata;
pdata = &data[0];
for(int i=0; i<5; i++)
printf(“%d\t”, *(pdata + i));
}
POINTER KE STRUCT
#include “stdio.h”
void main()
{ struct {
int jari_jari;
float luas;
}lingkaran, *pdata;
pdata = &lingkaran;
pdata->jari_jari = 10;
pdata->luas = 314;
printf(“Jari jari = %d\tLuas = %f\n”,
pdata->jari_jari, pdata->luas);
}
Minggu Kedelapan
Ujian Tengah Semester
Minggu Kesembilan
(Single) Linked List
Definisi linked list
Operasi dasar
Contoh program
Ilustrasi Singly Linked List
Data 1
Data 1
Data 2
Next node
Data 2
Next node
Data 4
Data 4
NO NEXT
Data 3
Data 3
Next node
In this linked list example, each node has two
pieces of data. Each node also has a pointer to
the next node.
So, we need two things to form a linked list: a
way to combine various datatypes and variables
together into one datatype and a way to “point”
to the next one of these combination datatypes.
So…how can we accomplish this?
The first goal, combining various datatypes and
variables into one datatype, is easily handled
with a structure.
The second goal, being able to “point” to the
next structure is easily handled using pointers.
So, we have all of the components we need in
order to construct a linked list.
Linked List
Struktur data yang terdiri dari beberapa simpul (node)
dimana setiap simpulnya saling terhubung (linked).
Simpul berupa struct, sedangkan link berupa komponen
simpul yang bertipe pointer ke simpul.
Bersifat dinamis. Memakai perintah malloc() dan free().
Umumnya memiliki pointer head untuk menunjukkan
alamat simpul terdepan dan pointer tail untuk
menunjukkan simpul terakhir.
Operasi penambahan/ penghapusan sebuah simpul
akan meng-update nilai pointer link-nya.
Pointer link simpul terakhir diberi nilai NULL (kecuali
untuk circular linked list).
Linked List Sederhana
Deklarasi struktur data :
typedef struct simpul {
char nama[20];
float nilai;
struct simpul *next_simpul;
} simpulku;
void main()
simpulku *simpul1, *simpul2, *simpul3;
//alokasi memori
simpul1 = (simpulku *)malloc(sizeof(simpulku));
simpul2 = (simpulku *)malloc(sizeof(simpulku));
simpul3 = (simpulku *)malloc(sizeof(simpulku));
//isi data
strcpy(simpul1->nama, “Amin”);
strcpy(simpul2->nama, “Budi”);
strcpy(simpul3->nama, “Citra”);
simpul1->nilai=90; simpul2->nilai=20;
simpul3->nilai=100;
//sambungkan link-nya
simpul1->next_simpul = simpul2;
simpul2->next_simpul = simpul3;
simpul3->next_simpul = NULL;
Alamat = 1080
Alamat = 2370
Amin
Budi
Citra
90
20
100
1080
2370
NULL
Alamat = 1000
simpul1
1000
simpul2
1080
simpul3
2370
Alamat = 1080
Alamat = 2370
Amin
Budi
Citra
90
20
100
1080
2370
NULL
Alamat = 1000
Pointer Tail
simpul1
1000
Pointer Head
Ilustrasi Inserting a Node
T
update
Alamat = 1080
Alamat = 2370
Amin
Budi
Citra
90
20
100
1080
8460
NULL
Alamat = 1000
Alamat = 8460
simpul1
1000
New
New->next = T->next
T->next = New
Dewi
98
2370
Ilustrasi Deleting a Node
P
T
update
Alamat = 1080
Alamat = 2370
Amin
Budi
Citra
90
20
100
2370
2370
NULL
Alamat = 1000
free()
simpul1
1000
P->next = T->next
free(T)
Contoh Program Linked List
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
struct node{
int info;
struct node *next;
};
typedef struct node *simpul;
void main()
{
simpul baru, head=NULL, tail=NULL, temp;
int pilih;
do
{
printf("MENU\n");
printf("1. Insert\n");
printf("2. View\n");
printf("3. Search\n");
printf("4. Delete\n");
printf("PILIH: ");
scanf("%d", &pilih);
switch(pilih)
{ ………
}
}while (pilih!=5);
}
Insert Node
case 1:
int data;
printf("Data Masuk: "); scanf("%i", &data);
baru = (simpul) malloc(sizeof (struct node));
baru->info = data;
baru->next = NULL;
if (head == NULL)
//list masih kosong
{
//simpul yg pertama kali
head = baru;
tail = baru;
}
else
{
tail->next = baru;
tail = baru;
}
break;
Show All Node
case 2:
temp = head;
while(temp!=NULL)
{
printf("%i ", temp->info);
temp = temp->next;
}
printf("\n");
break;
Search a Node
case 3:
int cari;
printf("Cari Angka: ");
scanf("%i", &cari);
temp = head;
while((temp!=NULL)&&(temp->info!=cari))
{
temp = temp->next;
}
if(temp != NULL && temp->info == cari)
printf("Data Ditemukan");
else //if(temp == NULL)
printf("Data Tidak Ditemukan");
printf("\n");
break;
Delete a Node
case 4:
int hapus;
char jwb;
simpul prev = NULL;
printf("Hapus Angka: ");
scanf("%i", &hapus);
//temukan dulu node yang akan dihapus
temp = head;
while((temp!=NULL)&&(temp->info!=hapus))
{
prev = temp;
temp = temp->next;
}
//bersambung…
if(temp != NULL && temp->info == hapus) //ditemukan
{ printf("Yakin Dihapus? (y/t)"); flushall();
jwb=getch();
if(jwb == 'y')
{
if(temp->next != NULL && temp != head)
prev->next = temp->next;
else if (temp->next == NULL)
prev->next = NULL;
else if (temp == head && head->next == NULL)
head = NULL;
else if (temp == head && head->next != NULL)
head = head->next;
free(temp); //hapus node-nya
}
else
printf("Batal Dihapus");
}
else
printf("Data Tidak Ditemukan");
printf("\n");
break;
Capture Program
Minggu Kesepuluh
Macam-macam List
Singly linked list
Doubly linked list
Singly circular linked list
Doubly circular linked list
Singly and Doubly
A linked list node containing a single forward pointer
may be declared as follows
struct Node {
int
struct Node
};
data;
/* or whatever */
*next_in_line;
pointer to next
Node structure
A linked list node containing a forward and a
backward pointer may be declared as follows
struct Node {
int
struct Node
struct Node
};
data;
*next_in_line;
*previous_in_line;
pointer to next
Node structure
pointer to previous
Node structure
Circular Linked List
Minggu Kesebelas
Stack
Definisi Stack
Operasi-operasi dasar Stack
Push
Pop
Contoh program operasi dasar Stack
menggunakan array
STACK (TUMPUKAN)
Kumpulan items yang teratur dimana items baru
akan dimasukkan ke dan sebuah items akan
dikeluarkan dari satu ujung yang sama, yaitu
dari TOP sebuah stack.
Struktur data linier dimana hanya bagian TOPnya saja yang bisa diakses.
Bersifat LIFO = Last In First Out.
Bisa diimplementasikan menggunakan array
atau Linked List.
Last In First Out
Penggunan Stack
History pada web browser.
Undo Log pada text editor.
Pemrosesan struktur bersarang (nested) :
loop, rekursi, fungsi, dll.
Algoritma back tracking – Artificial
Intelegence
Operasi Dasar Stack
Push : memasukkan sebuah item baru ke
dalam stack.
Pop : mengeluarkan sebuah item dari
stack.
Operasi lain : Is_Empty, Is_Full
Note : pop dan push dilakukan melalui
ujung yang sama (TOP)
Visualisasi Operasi Stack
TOP
E
X
remove:
“POP”
insert ‘B’:
PUSH ‘B’
X
A
B
X
TOP
A
TOP
A
Y
O
W
W
R
R
R
T
T
T
T
P
P
P
K
K
K
K
K
D
D
D
D
D
D
D
D
D
D
a
b
c
d
e
f
g
h
i
j
Deklarasi Struktur Data Stack
#define maxsize 100
// mendefinisikan maks ukuran data
// dlm stack
typedef struct {
int
top;
// indeks TOP
char
items [ maxsize ] // array
} stack;
// nama tipe data baru yg dibuat
// adalah stack
Deklarasi Fungsi-Fungsi Stack
void
void
void
void
initialize ( stack *s)
pop ( stack *s, char *x )
push ( stack *s, char x )
show ( stack *s )
Fungsi Initialize
void initialize ( stack *s)
// operasi initialize dg parameter
// s bertipe pointer stack
{
s -> top = -1;
// top = -1 stack dlm kondisi empty
}
Fungsi Push
void push ( stack *s, char x )
{
if (s->top >= (maxsize-1)) //stack is full
printf("\nERROR: the stack is full!");
else {
s->top = s->top + 1;
s->items [ s->top ] = x;
printf("\nPUSH SUCCEED");
}
}
Fungsi Pop
void pop ( stack *s, char *x )
{
if (s->top < 0)
// stack is empty
printf("\nERROR: the stack is empty!");
else {
*x = (s->items [ s->top ]);
s->top = s->top - 1;
printf("\nPOP SUCCEED");
}
}
Fungsi Show
void show( stack *s )
{
printf("\nISI STACK :\n");
for(int i=s->top; i>=0; i--)
printf("\t%c\n", s->items[i]);
printf("\n");
}
Fungsi Main
void main()
{
stack *my_stack, s;
char item, *x;
my_stack = &s;
x = &item;
initialize(my_stack);
push(my_stack, 'A'); push(my_stack, 'R');
push(my_stack, 'I'); push(my_stack, 'F');
show(my_stack);
pop(my_stack, x); pop(my_stack, x);
show(my_stack);
pop(my_stack, x); pop(my_stack, x);
show(my_stack);
}
Output Program
Stack – Linked List
Jika sebuah linked list SELALU
menambahkan node baru dan menghapus
node lama dari salah SATU ujungnya saja
(posisi Head ataukah Tail) STACK.
TOP = head untuk single linked list.
TOP = tail untuk double linked list.
HOW?
Push Operation
Pop Operation
Minggu Keduabelas
Pengecekan Tanda Kurung
valid = true
s = the_empty_stack
while ( we_have_not_read_the_entire_string )
{ read the next symbol (symb) of the string
if ( symb == ‘(‘ || symb == ‘[‘ || symb == ‘{‘ )
push ( s, symb )
if ( symb == ‘)‘ || symb == ‘]‘ || symb == ‘}‘ ){
if ( empty ( s ) ) valid = false
else
{
k = pop ( s );
if ( k is_not_the_matching_opener_of_symb )
valid = false
} // end else }
} // end while
if ( ! empty ( s ) ) valid = false
if ( valid ) output ( “the string is valid” )
else output ( “the string is not valid” );
Example Case
1.
2.
3.
Cek apakah string di bawah ini valid!
(a+b)}
(h-(j-(k-[l-n]))
{x+(y-[a+b])*c-[(d+e)]}
Evaluasi Postfix
Postfix adalah bentuk persamaan
matematika dimana operator ditulis
setelah kedua operannya.
Contoh :
AB+
CDE*-
FG/H+
Latihan : Ubah ke postfix
((A+B)*C
– (D – E))^(F+G)
Algoritma Infix Postfix
Tambahkan tanda kurung untuk
mengelompokkan operasi.
Keluarkan operator ke sebelah kanan
tanda kurung untuk setiap kelompok satu
per satu.
Hilangkan semua tanda kurung.
Algoritma Evaluasi Postfix
opndstck = the_empty_stack
/* scan the input string, one by one element, into symb
while ( not_end_of_input_string )
{ symb = next_input_character
if ( symb_is_an_operand )
push ( opndstck, symb )
else /* symb is an operator */
{
opnd2 = pop ( opndstck )
opnd1 = pop ( opndstck )
value = opnd1 (symb) opnd2
push ( opndstck, value )
} /* end else */
} /* end while */
return ( pop ( opndstck ) )
Latihan :
Jika A = 1, B = 2, C = 3, hitunglah :
1. AB+C–
2. ABC+–
3. AB*CD+^
Aplikasi 1 :
Pengecekan
Tanda Kurung
Algoritma
valid = true
s = the_empty_stack
while ( we_have_not_read_the_entire_string )
{ read the next symbol (symb) of the string
if ( symb == ‘(‘ || symb == ‘[‘ || symb == ‘{‘ )
push ( s, symb )
if ( symb == ‘)‘ || symb == ‘]‘ || symb == ‘}‘ )
if ( empty ( s ) ) valid = false
else
{
k = pop ( s )
if ( k is_not_the_matching_opener_of_symb )
valid = false
} // end else
} // end while
if ( ! empty ( s ) ) valid = false
if ( valid ) output ( “the string is valid” )
else output ( “the string is not valid” )
Contoh
1.
2.
3.
Cek apakah string di bawah ini valid!
(a+b)}
(h-(j-(k-[l-n]))
{x+(y-[a+b])*c-[(d+e)]}
Aplikasi 2 :
Konversi
Infix ke Postfix
Ekspresi Aritmatika
Ekspresi aritmatika umumnya ditulis dalam
bentuk infix.
Contoh :
A+B
A-C+B
A+((B*C)/D)
Komputer lebih mudah mengevaluasi
ekspresi postfix, karena tidak perlu
mengelompokkan subekspresi kedalam
tanda kurung.
Infix, Postfix, dan Prefix
Infix
Postfix
Prefix
A*B
A*(B+C)
AB*
ABC+*
*AB
*A+BC
(A*B)+C
AB*C+
+*ABC
A+((B*C)/D)
ABC*D/+
+A/*BCD
(A^2+B^2)*(C-D) A2^B2^+CD-* *+^A2^B2-CD
Algoritma
String infix, postfix
s = stack kosong
while (seluruh infix belum dibaca)
{
baca simbol selanjutnya pada infix (symb)
if symb adalah operand
tambahkan pada postfix
else if symb adalah ‘(‘, ‘{‘, ‘[‘
PUSH symb
else if symb adalah ‘)‘, ‘}‘, ‘]‘
while(TopOp stack adalah operator)
POP stack dan tambahkan ke postfix
POP stack
else if symb adalah operator{
if stack kosong
PUSH symb ke stack
else{
TopOp =baca data di TOP stack
if(symb>TopOp)
PUSH symb ke stack
else if TopOp adalah ‘(‘, ‘{‘, ‘[‘
PUSH symb ke stack
else {
POP stack dan tambahkan pada postfix
PUSH symb ke stack
}
}
}
}
if stack tidak kosong
POP stack dan tambahkan ke postfix
Aplikasi 3 :
EVALUASI
POSTFIX
Algoritma
s = stack kosong
while(seluruh string belum dibaca)
{
baca simbol selanjutnya (symb)
if symb adalah angka
PUSH symb
if symb adalah operator
OpKanan = POP stack
OpKiri = POP stack
hitung hasil
PUSH hasil
}
POP stack untuk memperoleh hasil akhir
Minggu Ketigabelas
Queue
Definisi Queue
Operasi-operasi dasar Queue
Insert/
enqueue
Remove/ dequeue
Contoh program operasi dasar Queue
menggunakan array
Queue
Sequence of items.
Items dimasukkan dari ujung belakang,
dikeluarkan dari ujung depan.
Bersifat FIFO (First In First Out).
Jenis Queue
Normal queue.
Circular queue.
DE-queue (double ended).
Ex. High and low priority policy
Priority queue.
Penggunaan Queue
Waiting list – birokrasi.
Simulasi sistem antrian.
Antrian printer jobs.
Antrian proses multitasking dalam CPU.
Antrian playlist winamp.
Operasi Dasar
Enqueue
Memasukkan item ke dalam queue.
Dequeue
Mengeluarkan item dari queue.
Is_Full
Mengecek apakah queue penuh.
Is_Empty
Mengecek apakah queue kosong.
Initialize
Membuat queue untuk pertama kali.
Deklarasi Struktur Data Queue
#define maxsize 100
typdef struct {
int jumlah;
//jumlah data
int depan;
//ujung depan
int belakang; //ujung belakang
char data [ maxsize ]; //array isi
queue
}queue;
Initialize
void initialize ( queue *q )
{
q -> jumlah = 0;
q -> depan = 0;
q -> belakang = 0;
}
Is_Empty
int Is_Empty ( queue *q )
{
if (q -> jumlah == 0)
return (1);
else
return (0);
}
Is_Full
int Is_Full ( queue *q )
{
if (q -> jumlah == maxsize)
return (1);
else
return (0);
}
Enqueue
void enqueue ( char X, queue *q )
{
if ( Is_Full(q) )
printf(“\nERROR: queue sudah penuh\”);
else
{
q->data[q->belakang] = X;
q->belakang = (q->belakang+1)%maxsize;
++(q->count);
}
}
Dequeue
void dequeue ( queue *q, char X )
{
if ( Is_Empty(q) )
printf(“\nERROR: queue sudah kosong\”);
else
{
X = q->data[q->depan];
q->depan = (q->depan+1)%maxsize;
--(q->count);
}
}
Show_Queue
void show_queue(queue *q)
{
printf("\nIsi Queue:\n");
for(int i=q->depan; i<q->belakang; i++)
printf("%c ", q->data[i]);
printf("\n");
}
Note: script ini khusus untuk normal queue
void main()
queue kyu, *q;
char x, *px;
q = &kyu;
px = &x;
inisialisasi(q);
enqueue('Q', q); show_queue(q);
enqueue('U', q); show_queue(q);
enqueue('E', q); show_queue(q);
enqueue('U', q); show_queue(q);
enqueue('E', q); show_queue(q);
dequeue(q,px); show_queue(q);
dequeue(q,px); show_queue(q);
dequeue(q,px); show_queue(q);
dequeue(q,px); show_queue(q);
dequeue(q,px); show_queue(q);
Output
Queue – Linked List
Jika sebuah linked list SELALU
menambahkan node baru di ujung Tail
dan SELALU menghapus node lama dari
ujung Head QUEUE.
Front = head.
Rear = tail.
Single atau Double linked list?
Enqueue Operation
Dequeue Operation
Minggu
Keempatbelas
Graph
Macam struktur data
LINIER
Elemen data tersusun secara berurutan.
Contoh : stack dan queue
HIRARKI
Elemen data tersusun secara bertingkat.
Contoh : tree
KOMPLEK
Elemen data tersusun secara kombinasional.
Contoh : graph
Graph & Tree
Struktur data non-linier.
Penambahan atau penghapusan elemen data
tidak mengakibatkan strukturnya tumbuh atau
menyusut secara linier (garis lurus).
Strukturnya bersifat hierarkis multidimensi 2
dimensi atau lebih.
Umumnya diimplementasikan dengan array
multidimensi atau linked list multilink.
Pengenalan Graph
Komponen penyusun :
Vertices
(node)
Edges (arc/ link)
Jenis :
Weighted/
non weighted graph
Directed/ non directed graph
Traversal (penelusuran) :
DFS
(Depth First Search)
BFS (Breadth First Search)
Contoh kasus : path lintasan terpendek
Contoh Struktur Data
# define MAXNODES 50
struct node{
/* informasi sebuah node */
};
Struct arc{
int adj;
/* informasi sebuah arc */
};
Struct graph{
struct node nodes[MAXNODES];
struct arc arcs[MAXNODES][MAXNODES];
};
Struct graph g;
DFS
Pencarian dilakukan dari node awal (root)
lalu ke simpul anak hingga yang paling
akhir (leaf)
Jika tujuan yang diinginkan belum tercapai
maka pencarian dilanjutkan ke cabang
sebelumnya
BFS
Pencarian dilakukan dengan mengunjungi
setiap node pada level yang sama sampai
mencapai tujuan atau sampai node
terakhir
Minggu Kelimabelas
Presentasi Tree
Pengenalan Tree
Tree nodes contain two or more links
All other data structures we have discussed only
contain one
Binary trees
All
nodes contain two links
None, one, or both of which may be NULL
The
root node is the first node in a tree.
Each link in the root node refers to a child
A node with no children is called a leaf node
Struktur Data
#define NUMNODES 500
Struct nodetype{
int info;
int left;
int right;
int father;
};
Struct nodetype node[NUMNODES];
Struct nodetype{
int info;
struct nodetype *left;
struct nodetype *right;
struct nodetype *father;
};
Struct nodetype *NODEPTR;
Tree traversals
Inorder traversal
1. Traverse the left subtree with an inorder traversal
2. Process the value in the node (i.e., print the node value)
3. Traverse the right subtree with an inorder traversal
Preorder traversal
1. Process the value in the node
2. Traverse the left subtree with a preorder traversal
3. Traverse the right subtree with a preorder traversal
Postorder traversal
1. Traverse the left subtree with a postorder traversal
2. Traverse the right subtree with a postorder traversal
3. Process the value in the node
Binary Tree Search
p = tree;
while ( p != null && key != pinfo)
if (key < pinfo)
p = pleft;
else
p = pright;
return (p);
Minggu
Keenambelas
Ujian Akhir Semester