algoritma dan struktur data - E

advertisement
STRUKTUR DATA
:: Fetty Tri Anggraeny ::
Tentang Saya



Fetty Tri Anggraeny, S.Kom
HP : (031)83031803
Email :
[email protected] atau [email protected]

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 != pinfo)
if (key < pinfo)
p = pleft;
else
p = pright;
return (p);
Minggu
Keenambelas
Ujian Akhir Semester
Download