MODUL PERKULIAHAN
Algoritma
Pemrograman &
Struktur Data
Pertemuan 1
PENDAHULUAN
Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh
Ilmu Komputer Teknik Informatika
01
87031 Tim DosenAbstract
Kompetensi
Membahas tentang konsep dasar dari algoritma dan struktur data
Mampu memahami konsep dasar dari
algoritma dan struktur data
Pendahuluan
Tipe dan Definisi Data
DEFINISI DATA :
ADALAH FAKTA ATAU KENYATAAN YANG TERCATAT MENGENAI SUATU OBYEK.
Pengertian data ini menyiratkan suatu nilai yang bisa dinyatakan dalam bentuk konstanta atau variabel.
Konstanta menyatakan nilai yang tetap
Variabel digunakan dalam program untuk menyatakan nilai yang dapat diubah-ubah selama eksekusi berlangsung.
ADA 4 ISTILAH TENTANG DATA YAITU :
1. Tipe Data : Macam / isi data di dalam suatu variable dalam bahasa program 2. Objek Data : Set dari elemen misal X set bilangan integer
3. Representasi Data : Suatu mapping dari struktur data d ke suatu set dari struktur data e misalnya Boolean direpresantasikan dalam 0 dan 1
4. Struktur Data : Struktur adalah koleksi dari variabel yang dinyatakan dengan sebuah nama, dengan sifat setiap variabel dapat memiliki tipe yang berlainan. Struktur data biasa dipakai untuk mengelompokkan beberapa informasi yang berkaitan menjadi sebuah kesatuan
TIPE DATA SEDERHANA
Hanya dimungkinkan untuk meyimpan sebuah nilai data dalam sebuah variabel.
Ada 5 macam :
- Bil. Bulat ( integer )
- Bil. Real presisi-tunggal ( Float ) - Bil. Real presisi-ganda ( Double ) - Karakter
- Tak bertipe/void (Tipe data untuk Fungsi) - Boolean ( Operator Logika )
TIPE TOTAL
BIT
KAWASAN KETERANGAN
Char 8 -128 s/d 127 Karakter
Int 16 -32768 s/d 32767 Bil Integer
Float 32 3.4E-38 s/d 3.4E+38 Bil real Presisi Tunggal
Double 64 1.7E-308 s/d 1.7E+308 Bil Real Presisi Ganda
Void 6 Tak bertipe
TIPE DATA BOOLEAN
Mempunyai 2 nilai : True dan False
OPERATOR Maksud
&& Dan ( And ) || Atau ( OR ) ! Tidak ( Not )
Operator Boolean biasa dipakai untuk menghubungkan ungkapan relasi
Operand 1 Operand 2 Hasil
|| &&
False False False False
False True True False
True False True False
TIPE DATA TERSTRUKTUR
Adalah tipe dimana suatu variabel bisa menyimpan lebih dari sebuah nilai data. Masing-masing nilai data disebut komponen.
Ada 5 macam :
1. Tipe String
Data yang berisi sederetan karakater dimana banyaknya karakter bisa berubah-ubah sesuai dengan kebutuhan.
Contoh Char Nama[30];
2. Larik (Array )
Variabel hanya menyimpan 1 tipe data saja. Contoh
Int A[10]; Float C[3][4];
3. Record
Terdiri dari beberapa variabel yang terstruktur dan masing-masing variabel bisa mempunyai tipe yang berbeda.
Contoh :
Struct Nama data_tanggal { int tanggal; int bulan; int tahun };
4. Set ( himpunan )
Union
Memungkinkan suatu lokasi memori ditempati oleh dua atau lebih variabel yang tipenya bisa berlainan.
Contoh : Union
{ unsigned int Angka;
unsigned char Huruf[12] } bil_X
Enumerasi
Merupakan himpunan dari konstanta integer yang diberi nama. Contoh :
enum manusia {pria,wanita}; enum manusia jns_kelamin;
jika jns_kelamin diisi pria maka nilai jns_kelamin=0 dan sebaliknya jika wanita nilai=1
5. File
Merupakan organisasi dari sejumlah record sejenis. Masing-masing record dapat terdiri dari satu atau beberapa field dan setiap field terdiri dari satu atau bebrapa karakter.
TIPE DATA POINTER
Variabel pointer berisi alamat dari suatu obyek lain (yaitu obyek yang ditunjuk oleh pointer tersebut).
Contoh int *pa;
pa = &x;
pointer pa menunjuk alamat x.
Algoritma
DEFINISI ALGORITMA :
Adalah himpunan langkah-langkah instruksi untuk melaksanakan suatu pekerjaan tertentu, dengan beberapa kriteria :
1. Ada input 2. Ada output
3. Jelas dan tidak meragukan (definiteness) 4. Ada terminasi (finiteness)
5. Efektif dan dapat dilaksanakan.
Ada sedikit perbedaan antara algoritma dan program.
Algoritma dan Metode Pemrograman
Penekanannya pada bagaimana memecahkan suatu masalah dengan algoritma yang tepat.
Dasar-dasar algoritma : - Statement Elementer - Statement Control Statement Elementer - Assignment - Comparison - Arithmetic Statement - Operator Boolean - Instruksi I/O Statement Control : - Alternatif - Pengulangan - Percabangan STATEMENT ELEMENTER : a. Assigment
Untuk memberikan nilai kevariabel yang telah dideklarasikan, bentuk pernyataan yang digunakan :
Contoh Bil3 = 0; b. Comparison
U/ keperluan pengambilan keputusan diperlukan operator relasi sebagai berikut : Operator >, <, >=, <=, = =, !=
c. Arithmetic Statement
Operator Aritmatika : +, - , *, /, ^
Ada operator aritmatika khusus yaitu mod (%) sisa pembagian. Contoh 7 % 2 hasilnya 1
d. Operator Boolean
Adalah operator logika dipakai untuk menghubungkan ungkapan relasi yang hasilnya True atau False
e. Operasi Input/Output
U/ memasukkan data kekomputer dalam Bahasa C/C++ Sbb : printf(),cin(),scanf(), getch(), getche()
U/ mengeluarkan data : printf(), puts(), putchar(),cout().
STATEMENT CONTROL
a. Alternatif
Terdiri dari pernyataan : - If , If - else , switch
Bentuk umum : If ( kondisi ) { pernyataan } If ( kondisi ) { pernyataan True } else { pernyataan False } switch ( ekspresi ) { case –1 : pernyataan 1 break; case – n : pernyataan n break } b. Pengulangan
Pernyataan pengulangan terdiri dari : - do while - while - for do { pernyataan } while (kondisi)
while ( kondisi ) { pernyataan } for (ungkapan1;ungkapan2;ungkapan3) { pernyataan } c. Percabangan
Memerlukan label sebagai identitas cabang.
label : { pernyataan } goto label
STRUKTUR DATA LINIER
Struktur data linier adalah struktur data yang menggambarkan hubungan tentang elemen-elemen yang berdekatan :
Terdiri dari :
ARRAY : a. Dimensi satu (vector matriks) b. Dimensi dua (matriks) c. Multi dimensi
Aplikasi penggunaan array diantaranya : a. Stack (tumpukkan) b. Queue (antrian)
LINKED LIST (LIST BERKAIT)
a. Linier Singly linked list b. Linier Doubly linked list c. Circular singly linked list d. Circular doubley linked list
Aplikasi linked list pada struktur data linier diantaranya : a. Linked stack
b. Linked Queue
Sedangkan multi linked list banyak digunakan pada struktur data non-linier yaitu untuk representasi tree maupun graph .
PENGELOLAAN MEMORI
Dapat secara STATIS atau DINAMIS Secara STATIS
Menempati lokasi memori yang tetap(fixed size), tidak dapat dikembangkan atau diciutkan.
Misal : array
Alamat memori menjadi kunci array
Secara DINAMIS
Menempati lokasi memori dimana dapat dikembangkan atau diciutkan sesuai dengan kebutuhan.
Latihan Soal
Buatlah algoritma sebagai berikut :
1. Menampilkan deret 1 3 5 7 9
2. Menampilkan deret 5 10 15 20 25 30
3. Menampilkan deret 100 ….. 0
4. Menampilkan deret bilangan prima 1 – 100 5. Menampilkan deret 1 2 3 4 5 6 7 8 9 10
DaftarPustaka
1. Pengantar Struktur Data dan Algoritma, Bambang Wahyudi, Penerbit Andi Yogyakarta, Edisi 1, 2004
2. Struktur Data dengan C, Paulus Bambangwirawan Dipl.Inf, Penerbit Andi Yogyakarta, Edisi 1, 2004
3. Pengantar Algoritma dengan Bahasa C, Thompson Susabda Ngoen, Penerbit Salemba Teknika, Edisi 1, 2004
4. Pemrograman C++, Abdul Kadir, Penerbit Andi Yogyakarta, Edisi 1, 2002 5. Struktur Data dengan C, C++, Moh. Sjukani, Mitra Wacana Media, Edisi 4
MODUL PERKULIAHAN
Algoritma
Pemrograman &
Struktur Data
Pertemuan 2
ARRAY
Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh
Ilmu Komputer Teknik Informatika
02
87031 Tim DosenAbstract
Kompetensi
Membahas tentang konsep dari array satu dimensi hingga array multidimensi
Mampu memahami konsep dasar dari array satu dimensi hingga array multidimensi
Array
Definisi Array
Array (larik) adalah tipe terstruktur yang terdiri dari sejumlah komponen-komponen dengan type yang sama.
Banyaknya komponen dalam suatu larik adalah tetap dan lokasi dalam suatu larik ditunjukkan oleh suatu INDEKS.
Yang penting dalam array adalah pengalamatan memori dan digunakan pengalamatan secara static.
Karakteristik pemakaian Array : - Jumlah elemen array terbatas
- Semua elemen array dapat diakses secara acak - Panjang elemen sama
Dimensi
Dalam bentuknya array dapat kita tinjau dari segi pengaturan struktur datanya dalam konteks dimensi sebagai berikut :
Array 1 – Dimensi List Vektor Array 2 – Dimensi Tables Matriks (2 dimensi) Array 3 – Dimensi Matriks 3 Dimensi Array Mulidimensi
Pada prinsipnya secara teori jumlah dimensi suatu matriks tidak terbatas, yang membatasi adalah kemampuan hardware dan besarnya memori
Array Satu Dimensi
Suatu array dideklarasikan dengan : A[ -3 . . 8 ], setiap elemen terdiri dari 4 byte. Jika alamat elemen pertama @A[ -3 ] = 1000 H ditanya :
A. Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat A[7] atau ditulis @A[7] Jawab :
Di ilustrasikan sebuah Array sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12
-3 -2 -1 0 1 2 3 4 5 6 7 8
1 2 3 4
Setiap elemen 4 Byte
@A[-3] = 1000 H maka @A[-2] = 1004 H
A. Jumlah Elemen = (Index atas - Index Bawah ) + 1 = ( 8 - (-3) ) + 1 = 12 Elemen
B. Jumlah Byte = JumlahElemen * Jumlah Byte PerElemen = 12 * 4
= 48 Byte C. Alamat @A[ 7 ] =
Dari @A[-3] berpindah/bergerak ke @A[7] = 7 - (-3)
= 10 Elemen
Setiap Elemen 4 Byte maka : 10 * 4 = 40 Byte
40 disini adalah dalam notasi 40 Decimal, dalam pengalamatan memori digunakan notasi Hexa Decimal. Maka 40 Decimal dirubah menjadi Hexa Decimal.
40 Decimal = 28 Hexa Decimal atau 28 H Jadi @A[7] = 1000 H + 28 H
Pendeklarasian A[ - 3 . . 8 ] adalah deklarasi yang ada pada bahasa program Pascal.
Pada bahasa program C/C++ pendeklarasian sedikit berbeda tapi mempunyai maksud yang sama.
Contoh
A[8]
Maka akan terbentuk Array 1 Dimensi sebanyak 8 tempat
0 1 2 3 4 5 6 7
Dimana nomor index pertama pada bahasa C dimulai dari 0 (nol)
Program C++ mengetahui alamat suatu data
#include<iostream.h> #include<conio.h> main() { int i,j,ANGKA[5]; clrscr();
for(i=0; i<5; i++) {
cout <<"MASUKAN ANGKA ["<<i<<"]= "; cin>>ANGKA[i]; }
for(i=0; i<5; i++) {
cout <<"ANGKA ["<<i<<"]= "<<ANGKA[i]<<" ADA DIALAMAT = "<<&ANGKA[i]<<endl;
} getch(); }
Array Dua Dimensi
Representasi matriks dalam bentuk array dua dimensi dapat berupa : Ukuran baris perbaris ( Row Major Order)
Ukuran Kolom perkolom ( Column Major Order)
Diketahui suatu Array dua dimensi yang dideklarasikan dengan A[ -1 .. 2 , 3 .. 8 ] Setiap elemen terdiri dari 4 Byte.
Alamat elemen pertama @A[-1,3] = 1000 H atau @A[-1,3] = 1000 H
Ditanya :
A. Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat A[2,5] atau @A[2,5] ?
Jika penempatan memori menggunakan : C1. Row Major Order
C2. Column Major Order
Jawab .
Di ilustrasikan sebuah Array sebagai berikut:
@A[-1,3] = 1000 H 3 4 5 6 7 8 -1 A B C D E F 0 G H I J K L 1 M N O P Q R 2 S T U V W X @A[2,5] = ?.
Pada Array 2 Dimensi yang diilustrasikan diatas, urutan elemennya dalam memori jika megikuti cara :
ROW MAJOR ORDER
(URUTAN YANG MENGUTAMAKAN/MENDAHULUKAN BARIS)
1 2 3 4 5 6 7 8 9….. 19 20 21 22 23 24
-1,3 -1,4 -1,5 -1,6 -1,7 -1,8 0,3 0,4 2,3 2,4 2,5 2,6 2,7 2,8
A B C D E F G H … .. S T U V W X
Baris Ke-1 Baris Ke-2 Baris ke 4 Baris (-1) Baris (0) Baris (2)
@A[-1,3] = 1000 H
Setiap pindah Satu Baris pindah 6 Elemen
COLUMN MAJOR ORDER
( URUTAN YANG MENDAHULUKAN KOLOM)
-1,3
A G M S B H N T C …. … Q W F L R X
kolom Ke-1 Kolom Ke-2 Kolom Ke 3 Kolom ke6 Kolom (3) Kolom (4) Kolom 5 Kolom 8
@A[-1,3] = 1000 H
Setiap pindah Satu Kolom pindah 4 Elemen
BILA DINYATAKAN DENGAN NOMOR URUT MAKA PENEMPATAN ELEMEN ARRAY :
CARA ROW MAJOR ORDER
3 4 5 6 7 8
-1 1 2 3 4 5 6
0 7 8 9 10 11 12
1 13 14 15 16 17 18
2 19 20 21 22 23 24
CARA COLUMN MAJOR ORDER
3 4 5 6 7 8
-1 1 5 9 13 17 21
0 2 6 10 14 18 22
1 3 7 11 15 19 23
2 4 8 12 16 20 24
Catatan : Angka- Angka Didalam Elemen Bukan Isi elemen tapi merupakan nomor Urut elemen.
Jawaban Soal ARRAY DUA DIMENSI
A. Jumlah Elemen = Baris * Kolom A[ -1..2 , 3 .. 8 ] = 4 * 6
= 24
2 - (-1)+1 (8-3)+1 = 4 Baris = 6 Kolom
3 4 5 6 7 8 -1 A B C D E F 0 G H I J K L 1 M N O P Q R 3 4 5 6 7 8 -1 1 2 3 4 5 6 0 7 8 9 10 11 12 1 13 14 15 16 17 18
C1. Menentukan Alamat @A[2,5]
menggunakan ROW MAJOR ORDER
@A[-1,3] = 1000 H
@A[2,5] =……?
Dari Gambar Diatas terlihat bahwa bergerak dari elemen A[-1,3] ke elemen A[2,5] yaitu elemen ke 21 menurut ROW MAJOR ORDER perpindahannya sebanyak :
21 – 1 = 20 Elemen
A T A U
Terlihat dari Baris –1 ke baris 2 sebanyak 3 Baris Setiap Baris ada 6 Elemen , Jadi 3 * 6 = 18 Elemen
Dari Kolom 3 Ke kolom 5 sebanyak 2 Kolom
Jadi Total Perpindahan = 18 + 2 = 20 Elemen
Satu Elemen 4 Byte Pindah 20 * 4 = 80 Byte 80 Dec = 50 Hexa Dec.
Atau tanpa melihat Gambar : A [Baris, Kolom ]
Ditanya : @A[ 2 , 5 ]
Diketahui : @A[ -1 , 3 ] Dikurang 3 2
Pindah 3 Baris = 3 * Banyak Elemen Per baris = 3 * 6 = 18
Pindah 2 Kolom = 2 2
Total Perpindahan 18 + 2 = 20 Elemen
3 4 5 6 7 8 -1 A B C D E F 0 G H I J K L 1 M N O P Q R 3 4 5 6 7 8 -1 1 5 9 13 17 21 0 2 6 10 14 18 22 1 3 7 11 15 19 23
Dimana 1 Elemen 4 Byte Jadi 20 * 4 = 80 Byte ( Decimal )
80 Decimal = 50 Hexa Decimal
Jadi Alamat @A[2,5] = 1000 H + 50 H = 1050 H
C2. Menentukan Alamat @A[2,5] menggunakan
COLUMN MAJOR ORDER
@A[-1,3] = 1000 H
@A[2,5] = ……?
Dari Gambar Diatas terlihat bahwa bergerak dari elemen A[-1,3] ke elemen A[2,5] yaitu elemen ke 12 menurut COLUMN MAJOR ORDER perpindahannya sebanyak :
12 – 1 = 11 Elemen
A T A U
Terlihat dari kolom 3 ke kolom 5 sebanyak 2 Kolom Setiap Kolom ada 4 Elemen , Jadi 2 * 4 = 8 Elemen Dari baris -1 Ke baris 2 sebanyak 3 baris
Jadi Total Perpindahan = 8 + 3 = 11 Elemen
Satu Elemen 4 Byte Pindah 11 * 4 = 44 Byte= 44 Dec 44 Dec = 2C Hexa,
3 4 5 6 7 8 -1 0 1 2 3 4 5 6 7 8 -1 0 1 2
Atau tanpa melihat Gambar : A [Baris, Kolom ]
Ditanya : @A[ 2 , 5 ]
Diketahui : @A[ -1 , 3 ] Dikurang 3 2
Pindah 2 Kolom = 2 * Banyak Elemen Per Kolom = 2 * 4 = 8
Pindah 3 Baris = 3 3 Total Perpindahan 8 + 3 = 11 Elemen
Dimana 1 Elemen 4 Byte Jadi ---- 11 * 4 = 44 Byte ( Decimal ) 44 Dec. = 2C Hexa Dec.l
Jadi Alamat @A[2,5] = 1000 H + 2C H = 102C H
Array Tiga Dimensi
Suatu Array dideklarasikan A[ 2 ..4 , -1 .. 2 , 3 .. 8 ], setiap elemen terdiri 4 byte. Alamat elemen pertama @A[2,-1,3]= 1000 H ditanya :
A. Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat @A[4,2,5]
C1. Menggunakan Row Major Order C2. Menggunakan Column Major Order
JAWAB ilustrasi : @A[2,-1,3] = 1000 H 3 4 5 6 7 8 -1 0 1 2
Blok 2 Blok 3 Blok 4
@A[4,2,5] =….?
3 4 5 6 7 8 -1 1 2 3 4 5 6 0 7 8 9 10 11 12 1 13 14 15 16 17 18 2 19 20 21 22 23 24 3 4 5 6 7 8 -1 25 26 27 28 29 30 0 31 32 33 34 35 36 1 37 38 39 40 41 42 2 43 44 45 46 47 48 3 4 5 6 7 8 -1 49 50 51 52 53 54 0 55 56 57 58 59 60 1 61 62 63 64 65 66 2 67 68 69 70 71 72 Blok Baris Kolom
(4 – 2 )+1 (2-(-1))+1 (8-3) + 1
3 Blok 4 Baris 6 Kolom
A[ 2 .. 4 , -1 .. 2 , 3 . . 8 ]
A. Jumlah Elemen: Jumlah Blok = ( 4 - 2 ) + 1 = 3 Blok Jumlah Baris = ( 2 – (-1) + 1 = 4 Baris Jumlah Kolom = ( 8 – 3 ) + 1 = 6 Kolom
Jumlah Elemen = 3 * 4 * 6 = 72 Elemen.
B. Jumlah Byte : 72 * 4 Byte = 288 Byte.
C1. ROW MAJOR ORDER @A[2,-1,3] = 1000 H
BLOK 2 BLOK 3 BLOK 4
@A[4,2,5] = ……?
Dari Gambar terlihat urutan perpindahan dari elemen no. 1 ke Elemen No. 69 perpindahan sebanyak 68 Elemen.
68 * 4 Byte =272 Byte --- 272 Dec. = 110 Hexa Dec.
Jika tidak melihat gambar dapat dihitung dengan melihat perpindahan Blok, Baris dan kolom.
Ditanya : @A[ 4 , 2 , 5 ]
3 4 5 6 7 8 -1 1 5 9 13 17 21 0 2 6 10 14 18 22 1 3 7 11 15 19 23 2 4 8 12 16 20 24 3 4 5 6 7 8 -1 25 29 33 37 41 45 0 26 30 34 38 42 46 1 27 31 35 39 43 47 2 28 32 36 40 44 48 3 4 5 6 7 8 -1 49 53 57 61 65 69 0 50 54 58 62 66 70 1 51 55 59 63 67 71 2 52 56 60 64 68 72 2 3 2
Pindah 2 Blok ( Dari Blok 2 Ke Blok 4 ) Setiap Blok Ada 24 Elemen
Jadi Perpindahan 2 * 24 = 48 Elemen
Pindah 3 Baris ( Dari Baris -1 Ke baris 2 ) Setiap Baris ada 6 Elemen
Jadi Perpindahan 3 * 6 = 18 Elemen
Pindah 2 Kolom ( 2 Elemen ) = 2 Elemen Jadi Jumlah Pepindahan 68 Elemen
Pindah = 68 Elemen = 68 * 4 Byte
= 272 Byte (Decimal) = 110 Hexa Dec
Jadi Alamat @A[4,2,5] = 1000 H + 110 H = 1110 H
C2. COLUMN MAJOR ORDER @A[2,-1,3] = 1000 H
BLOK 2 BLOK 3 BLOK 4
@A[4,2,5] = ……?
Dari Gambar terlihat urutan perpindahan dari elemen no. 1 ke Elemen No. 60 perpindahan sebanyak 59 Elemen.
Jika tidak melihat gambar dapat dihitung dengan melihat perpindahan Blok, Baris dan kolom.
Ditanya : @A[ 4 , 2 , 5 ]
Diketahui @A[ 2 , -1 , 3 ] Di kurang 2 3 2
Pindah 2 Blok ( Dari Blok 2 Ke Blok 4 ) Setiap Blok Ada 24 Elemen
Jadi Perpindahan 2 * 24 = 48 Elemen
Pindah 3 Baris ( Dari Baris -1 Ke baris 2 ) Pindah Sebanyak 3 Elemen = 3 Elemen
Pindah 2 Kolom ( Dari Kolom 3 Ke Kolom 5) Setiap Kolom 4 Elemen
Jadi Perpindahan 2 * 4 = 8 Elemen
Jadi Jumlah Pepindahan 59 Elemen Pindah = 59 Elemen
= 59 * 4 Byte
= 236 Byte (Decimal) = EC Hexa Dec
Array Empat Dimensi (Multidimensi)
Diketahui suatu Array Multi Dimensi yang dideklarasikan dengan A[1..2, 2..4, -1..2, 3..8 ]. Setiap elemen terdiri dari 4 Byte. Alamat elemen pertama @A[1,2,-1,3] = 1000 H
Ditanya : A . Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat @A[2,4,2,5] ?
C1. Row Major Order C2. Column Major Order Jawab
Grup Blok Baris Kolom (2 –1)+1 (4-2)+1 (2-(-1)+1 (8-3)+1 2 Grup 3 Blok 4 Baris 6 Kolom A [ 1 . . 2 , 2 . . 4 , -1 . . 2 , 3 . . 8 ] ILUSTRASI GRUP 1 3 4 5 6 7 8 3 4 5 6 7 8 3 4 5 6 7 8 -1 0 1 2
Blok 2 Blok 3 Blok 4
GRUP 2 3 4 5 6 7 8 3 4 5 6 7 8 3 4 5 6 7 8 -1 0 1 2
Blok 2 Blok 3 Blok 4
A. Jumlah Elemen = 2 Grup * 3 Blok * 4 Baris * 6 Kolom = 144 Elemen
C1. ROW MAJOR ORDER GRUP 1 3 4 5 6 7 8 3 4 5 6 7 8 3 4 5 6 7 8 -1 0 1 2
Blok 2 Blok 3 Blok 4
GRUP 2 3 4 5 6 7 8 3 4 5 6 7 8 3 4 5 6 7 8 -1 0 1 2 1 4 1 Blok 2 Blok 3 Blok 4
C2. COLUMN MAJOR ORDER
GRUP 1 3 4 5 6 7 8 3 4 5 6 7 8 3 4 5 6 7 8 -1 0 1 2
Blok 2 Blok 3 Blok 4
GRUP 2 3 4 5 6 7 8 3 4 5 6 7 8 3 4 5 6 7 8 -1 0 1 2
Latihan Soal
Latihan Array satu dimensi :
1. Suatu array dideklarasikan dengan : A[-2 .. 5 ], setiap elemen terdiri dari 6 byte. Jika alamat elemen pertama FFBB H ditanya :
a. Jumlah Elemen
b. Jumlah Byte Seluruhnya c. Alamat A[4] atau ditulis @A[4]
2. Suatu array dideklarasikan dengan : A[9] pada Bahasa C++, setiap elemen terdiri dari 8 byte. Jika alamat elemen pertama 16FF H ditanya :
a. Jumlah Elemen
b. Jumlah Byte Seluruhnya c. Alamat A[5] atau ditulis @A[5]
3 Suatu array dideklarasikan pada bahasa C++ dengan :
float angka[12]; Jika alamat elemen pertama 2C3E H ditanya : a. Jumlah Elemen
b. Jumlah Byte Seluruhnya c. Alamat A[6] atau ditulis @A[6]
Latihan Array dua dimensi :
1. Diketahui suatu Array dua dimensi yang dideklarasikan dengan A[-2..3,3..6]. Setiap elemen terdiri dari 2 Byte. Alamat elemen pertama FECA H
Ditanya : A . Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat A[2,5] atau @A[2,5] ? Jika penempatan memori menggunakan :
C1. Row Major Order C2. Column Major Order
2. Diketahui suatu Array dua dimensi yang dideklarasikan dengan A[5][6] Pada Bahasa C++. Setiap elemen terdiri dari 10 Byte. Alamat elemen pertama @A[0][0]=FBCA H Ditanya : A . Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat A[3,2] atau @A[3,2] ? Jika penempatan memori menggunakan :
C1. Row Major Order C2. Column Major Order
3. Diketahui suatu Array dua dimensi yang dideklarasikan dengan : long A[6][7] Pada Bahasa C.
Alamat elemen pertama 10CC H Ditanya : A . Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat A[2,5] atau @A[2,5] ? Jika penempatan memori menggunakan :
C1. Row Major Order C2. Column Major Order
Latihan Array tiga dimensi :
1. Diketahui suatu Array 3 dimensi yang dideklarasikan dengan A[-2..2,1..4,3..6]. Setiap elemen terdiri dari 6 Byte. Alamat elemen pertama FC8B H
Ditanya : A . Jumlah Elemen
B. Jumlah Byte Seluruhnya
C. Alamat A[1,3,5] atau @A[1,3,5] ? C1. Row Major Order
C2. Column Major Order
2. Diketahui suatu Array 3 dimensi yang dideklarasikan dengan A[2][5][6] Pada Bahasa C++.Setiap elemen terdiri dari 4 Byte. Alamat elemen pertama BC9A H
Ditanya : A . Jumlah Elemen
B. Jumlah Byte Seluruhnya C. Alamat A[1,3,5] ?
C1. Row Major Order C2. Column Major Order
3. Diketahui suatu Array 3 dimensi yang dideklarasikan dengan : longdouble A[4][3[7] Pada Bahasa C++.
Alamat elemen pertama CBBA H
B. Jumlah Byte Seluruhnya C. Alamat A[3,2,6] ?
C1. Row Major Order C2. Column Major Order
Latihan Array empat dimensi (multidimensi) :
1. Diketahui Array Multi dimensi yang dideklarasikan dengan A[2..4,-1..4,3..6,1..6]. setiap elemen 8 Byte. Alamat elemen Pertama F2BE H.
Ditanya A. Jumlah Elemen
B. Jumlah Byte Seluruhnya C. @A[2,4,4,5]
C1. Row Major Order C2. Column Major Order
2. Diketahui Array Multi dimensi yang dideklarasikan dengan A[4][3][2][3] dengan Bhs. C. setiap elemen 4 Byte. Alamat elemen Pertama 2BCE H.
Ditanya A. Jumlah Elemen
B. Jumlah Byte Seluruhnya C. @A[1,2,1,2]
C1. Row Major Order C2. Column Major Order
3. Diketahui Array Multi dimensi yang dideklarasikan
int A[5][2][6][8][3] dengan Bhs. C++. Alamat elemen Pertama 3CDE H. Ditanya A. Jumlah Elemen
B. Jumlah Byte Seluruhnya D. @A[3,0,3,6,2]
C1. Row Major Order C2. Column Major Order
Daftar Pustaka
1. Pengantar Struktur Data dan Algoritma, Bambang Wahyudi, Penerbit Andi Yogyakarta, Edisi 1, 2004
2. Struktur Data dengan C, Paulus Bambangwirawan Dipl.Inf, Penerbit Andi Yogyakarta, Edisi 1, 2004
3. Pengantar Algoritma dengan Bahasa C, Thompson Susabda Ngoen, Penerbit Salemba Teknika, Edisi 1, 2004
4. Pemrograman C++, Abdul Kadir, Penerbit Andi Yogyakarta, Edisi 1, 2002 5. Struktur Data dengan C, C++, Moh. Sjukani, Mitra Wacana Media, Edisi 4
MODUL PERKULIAHAN
Algoritma
Pemrograman &
Struktur Data
Pertemuan 3
LINKED LIST
Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh
Ilmu Komputer Teknik Informatika
03
87031 Tim DosenAbstract
Kompetensi
Membahas tentang konsep dari linked list dan penerapannya
Mampu memahami konsep dasar dari
dari linked list dan penerapannya
Linier Singly Linked List
Linier Singly Linked List
- Pengelolaan memory secara dinamis artinya tidak perlu mengalokasikan memori lebih awal secara tetap (fixed).
- Satu elemen terdiri dari 2 elemen :
a. Elemen yang menyimpan data
b. Elemen yang menyimpan alamat record
ILLUSTRASI
FIRST LAST
INFO LINK INFO LINK INFO LINK INFO LINK
25 12 17 10
( 1 ) ( 2) ( 3 ) ( 4 )
Keterangan dari ilustrasi Linked List :
- Ada 4 Simpul : simpul 1 s/d simpul 4 - Setiap simpul(record) terdiri 2 elemen yaitu : Field INFO misal bertipe Integer Field LINK bertipe Pointer
Contoh simpul no. 1
Field INFO berisi nilai 25
Field LINK berisi alamat record no. 2
Simpul No. 3
Field INFO berisi nilai 17
Field LINK berisi alamat record no. 4 FIRST dan LAST adalah pointer
Proses yang dapat dilakukan : a. Pembuatan Simpul Awal
b. Insert kanan (akhir) c. Delete Kanan d. Insert Tengah e. Insert Kiri f. Delete Kiri g. Delete Tengah
ILUSTRASI SEBUAH SIMPUL (RECORD)
INFO LINK
Nama Field : LINK Tipe : Pointer
Isi : akan diisi alamat Record Berikutnya Nama Field : INFO
Tipe : Integer
Isi : akan diisi data
Dalam bahasa C/C++ untuk memberitahukan komputer bahwa kita memerlukan suatu simpul atau record dengan tipe struktur diatas perlu ditulis instruksi-instruksi sebagai berikut:
Struct SIMPUL {
int INFO;
struct SIMPUL *LINK; };
struct SIMPUL *P, *FIRST, *LAST;
disiapkan 3 buah pointer yaitu P, FIRST, LAST yang semuanya terkait dengan simpul atau record .
a. Pembuatan Simpul Awal
Instruksi untuk membuat sebuah simpul (record) baru adalah :
P=(struct SIMPUL*) malloc(sizeof(struct SIMPUL*));
Malloc : Maksudnya mengalokasikan memory Sebesar atau seukuran (sizeof) yang diperlukan Untuk simpul.
Contoh sederhana (lengkap) program membuat Simpul Awal:
#include <iostream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h>
struct SIMPUL { int INFO;
struct SIMPUL *LINK; };
struct SIMPUL *P, *FIRST, *LAST;
main( ) { int X; clrscr();
cout<<"MASUKAN SIMPUL AWAL : "; cin>>X;
P=(struct SIMPUL*)malloc(sizeof(struct SIMPUL)); P->INFO=X;
P->LINK=NULL;
cout<<" ANGKA YANG DIMASUKKAN = "<<P->INFO<<endl; getch();
}
Perhatikan kembali Linier Singly Lingked List
FIRST LAST
INFO LINK INFO LINK INFO LINK INFO LINK
25 12 17 10
( 1 ) ( 2) ( 3 ) ( 4 )
Fungsi untuk membuat simpul(Record) AWAL void AWAL(void)
{ int X;
cout<<”MASUKKAN SIMPUL AWAL : “; cin>>X;
P=(struct SIMPUL*) malloc(sizeof(struct SIMPUL*)); P->INFO=X;
FIRST = P; LAST=P;
P->LINK=NULL; }
b. INSERT KANAN (INSERT AKHIR)
sudah dibuat Simpul awal sebagai berikut : FIRST LAST P INFO LINK 25 ( 1 )
Akan diinsert disebelah kanan seperti berikut
FIRST LAST
INFO LINK INFO LINK
25 12
( 1 ) ( 2)
Fungsi untuk Insert Kanan sebagai berikut :
void InsertKanan(void) { int X;
cout<<”MASUKKAN SIMPUL KANAN : “; cin>>X;
P=(struct SIMPUL*) malloc(sizeof(struct SIMPUL*)); P->INFO=X; LAST->LINK=P; LAST=P; P->LINK=NULL; } c. DELETE KANAN
Misal sudah ada Linked List sebagai berikut:
FIRST Q LAST
INFO LINK INFO LINK INFO LINK INFO LINK
25 12 17 10
( 1 ) ( 2) ( 3 ) ( 4 )
void DeleteKanan(void) { int X;
X=LAST->INFO;
cout<<”DATA YANG AKAN TERHAPUS”<<X; free(LAST); LAST=Q; LAST->LINK=NULL; } Buat Fungsi : a. Insert Tengah b. Insert Kiri c. Delete Kiri d. Delete Tengah
Linier Doubly Linked List
- Pengelolaan memory secara dinamis artinya tidak perlu mengalokasikan memori lebih awal secara tetap (fixed).
- Satu elemen terdiri dari 2 elemen : a. Elemen yang menyimpan data
b. Elemen yang menyimpan alamat record sebelumnya c. Elemen yang menyimpan alamat record sesudahnya
ILUSTRASI
FIRST LAST
LEFT INFO RIGHT
25 12 17 10
ILUSTRASI SEBUAH SIMPUL Simpul dengan 3 Elemen
LEFT INFO RIGHT
Nama Field : LEFT Nama Field : INFO Nama Field : RIGHT Type : Pointer Type : integer Type : Pointer
Isi : Akan diisi alamat Isi : akan diisi data Isi : akan diisi alamat Record sebelumnya Record sesudanya
Dalam Bahasa C++ untuk menyatakan suatu simpul dengan struktur demikian dapat ditulis sebagai berikut :
Struct SIMPUL {
int INFO;
struct SIMPUL *LEFT, *RIGHT; };
struct SIMPUL *P, *FIRST, *LAST;
Proses yang dapat dilakukan : a. Pembuatan Simpul Awal b. Insert kanan (akhir) c. Delete Kanan d. Insert Tengah e. Insert Kiri f. Delete Kiri g. Delete Tengah
a. Pembuatan Simpul Awal
Contoh sederhana (lengkap) program membuat Simpul awal:
#include <iostream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h>
struct SIMPUL { int INFO;
struct SIMPUL *LEFT,*RIGHT; };
struct SIMPUL *P, *FIRST, *LAST;
main( ) { int X; clrscr();
cout<<"MASUKAN SIMPUL AWAL : "; cin>>X;
P=(struct SIMPUL*)malloc(sizeof(struct SIMPUL)); P->INFO=X;
FIRST=P; LAST=P;
P->LEFT=NULL; P->RIGHT=NULL;
cout<<" Isi P = "<<P->INFO; }
Fungsi untuk membuat Simpul Awal
void AWAL(void) { int X;
cout<<”MASUKKAN SIMPUL AWAL :” cin>>X;
P=(struct SIMPUL*) malloc(sizeof(struct SIMPUL*)); P->INFO=X; FIRST=P; LAST=P; P->LEFT=NULL; P->RIGHT=NULL; }
Ilustrasi simpul yang dihasilkan oleh program misal X=25 LAST FIRST P
LEFT INFO RIGHT 25
Ada 3 buah pointer yang LAST, FIRST dan P yang menunjuk data yang sama.
b. Insert Kanan
Dibuat Simpul Awal sebagai berikut : LAST FIRST P
LEFT INFO RIGHT 25
(1)
Akan dibuat simpul baru disebelah kanan sebagai berikut FIRST LAST
LEFT INFO RIGHT
25 12
Fungsi untuk Insert Kanan Sebagai Berikut :
void InsertKanan(void) { int X;
cout<<”MASUKKAN SIMPUL KANAN”; cin>>X;
P=(struct SIMPUL*) malloc(sizeof(struct SIMPUL*)); P->INFO=X; LAST->RIGHT=P; P->LEFT=LAST; LAST=P; P->RIGHT=NULL; }
c. Delete Kanan (Akhir)
Sudah ada Double Linked List sebagai berikut :
FIRST LAST
LEFT INFO RIGHT
25 12 17 10
1 2 3 4
Akan dihapus simpul yang paling kanan (4) menjadi sebagai berikut: FIRST LAST
LEFT INFO RIGHT
25 12 17
1 2 3 Pointer LAST akan menunjuk Ke Record Ke 3
Fungsi untuk Delete Kanan Sebagai Berikut :
void DeleteKanan(void) { int X;
X=LAST->INFO;
cout<<”DATA YANG TERHAPUS”<<X; LAST=LAST->LEFT; free(LAST->RIGHT) LAST->RIGHT=NULL; } Buat Fungsi : a. Insert Tengah b. Insert Kiri c. Delete Kiri d. Delete Tengah
Praktikum
PRAKTEK DI LABORATORIUMDISAJIKAN SEBUAH PROGRAM LINIER SINGLE LINKED LIST /*PROGRAM LINIER SINGLY LINKED LIST */
#include <iostream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h>
struct SIMPUL { int INFO;
struct SIMPUL *LINK; };
struct SIMPUL *P, *FIRST, *LAST, *T, *Q; void AWAL(void);
void TAMPIL(void);
void INSERT_KIRI(void); void INSERT_TENGAH(void); void DELETE_KIRI(void); void DELETE_KANAN(void); void DELETE_TENGAH(void); void COBA(void); int X,PIL; main( ) { do { clrscr();
cout<<"LINIER SINGLY LIST"<<endl;
cout<<"======================"<<endl; cout<<"1. SIMPUL AWAL"<<endl;
cout<<"2. INSERT KANAN"<<endl; cout<<"3. INSERT KIRI"<<endl; cout<<"4. INSERT TENGAH"<<endl; cout<<"5. DELETE KANAN"<<endl; cout<<"6. DELETE KIRI"<<endl; cout<<"7. DELETE TENGAH"<<endl; cout<<"8. TAMPIL "<<endl;
cout<<"9. Exit"<<endl<<endl; cout<<"PILIHAN : "; cin>>PIL; switch (PIL) { case 1 : AWAL(); break; case 2 : INSERT_KANAN(); break; /* case 3 : INSERT_KIRI(); break; case 4 : INSERT_TENGAH(); break; */ case 5 : DELETE_KANAN(); break; /* case 6 : DELETE_KIRI(); break; case 7 : DELETE_TENGAH(); break; */ case 8 : TAMPIL(); break; case 9 :
cout<<"TERIMA KASIH"; break; } getch(); } while (PIL<9); } void AWAL(void) {
clrscr();
cout<<"MASUKAN SIMPUL AWAL : "; cin>>X;
P=(struct SIMPUL*)malloc(sizeof(struct SIMPUL)); P->INFO=X;
P->LINK=NULL; FIRST=P; LAST=P;
cout<<"Isi P = "<<P->INFO<<endl;
cout<<"Isi FIRST = "<<FIRST->INFO<<endl; cout<<"Isi LAST = "<<LAST->INFO<<endl; cout<<"Isi pointer P = "<<P->LINK<<endl;
cout<<"Isi pointer FIRST = "<<FIRST->LINK<<endl; cout<<"Isi pointer LAST = "<<LAST->LINK<<endl; }
void INSERT_KANAN(void) {
clrscr();
cout<<"MASUKAN SIMPUL KANAN : "; cin>>X;
P=(struct SIMPUL*)malloc(sizeof(struct SIMPUL)); P->INFO=X;
LAST->LINK=P; LAST=P;
P->LINK=NULL;
cout<<" Isi P = "<<P->INFO; } void DELETE_KANAN(void) { clrscr(); if (FIRST!=NULL) { P=FIRST; while(P->LINK!=NULL) { Q=P; P=P->LINK; } X=P->INFO;
cout<<"DATA YANG AKAN DIHAPUS : "<<X; free(P);
Q->LINK=NULL; LAST=Q;
} else
} void TAMPIL(void) { clrscr(); T=FIRST; while (T!=NULL) { X=T->INFO; cout<<X<<" "; T=T->LINK; } }
Buat procedure/Fungsi untuk :
1. Insert Kiri 2. Insert Tengah 3. Delete Kiri 4. Delete Tengah
Daftar Pustaka
1. Pengantar Struktur Data dan Algoritma, Bambang Wahyudi, Penerbit Andi Yogyakarta, Edisi 1, 2004
2. Struktur Data dengan C, Paulus Bambangwirawan Dipl.Inf, Penerbit Andi Yogyakarta, Edisi 1, 2004
3. Pengantar Algoritma dengan Bahasa C, Thompson Susabda Ngoen, Penerbit Salemba Teknika, Edisi 1, 2004
4. Pemrograman C++, Abdul Kadir, Penerbit Andi Yogyakarta, Edisi 1, 2002 5. Struktur Data dengan C, C++, Moh. Sjukani, Mitra Wacana Media, Edisi 4
MODUL PERKULIAHAN
Algoritma
Pemrograman &
Struktur Data
Pertemuan 4
STACK (TUMPUKAN)
Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh
Ilmu Komputer Teknik Informatika
04
87031 Tim DosenAbstract
Kompetensi
Membahas tentang konsep dari queue (antrian) dan penerapannya
Mampu memahami konsep dasar dari queue (antrian) dan penerapannya
STACK (TUMPUKAN)
Konsep Stack
Aplikasi penggunaan array berupa : Stack ( tumpukan ), Queue ( antrian ) dan Dequeue ( antrian 2 Arah )
Stack maksudnya tumpukan
Salah satu Ilustrasi Stack yang mudah dipahami
misalnya tumpukan buku diatas meja yang diilustrasikan sebagai berikut :
Nomor Nomor Urut Urut Masuk Keluar ( Push ) ( Pop ) 4 Buku 4 1 Top 3 Buku 3 2 2 Buku 2 3 1 Meja Buku 1 4 Dasar
Proses yang dapat dilakukan terhadap Stack PUSH untuk : - Penempatan atau
- Masuk, atau - Insert, atau - Tulis
POP untuk : - Ambil atau - Keluar, atau - Delete, atau - Baca/ Hapus
Mempunyai Prinsip :
LIFO (LAST IN FIRST OUT ) :
terakhir masuk, pertama keluar
Atau
Data masuk terakhir akan diambil pertama kali.
Stack I
Satu Stack dalam satu array. (array hanya digunakan oleh satu stack) Dasar Stack berada pada sisi index terkecil.
Ilustrasi misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n S[ ] 25 12 17 10 Dasar Top 0 4 10 Dasar Top X
a. Stack menggunakan array S[ ] dengan 10 elemen ( n=10) Isi Stack ada 4 Elemen.
S[1] yang paling bawah dan S[4] yang paling atas
Ada dua index ( baca Pointer ) yang digunakan yaitu dasar dan Top
Dasar : Untuk menunjuk dasar atau alas dari stack, isinya dalam hal ini selalu 0 Top : untuk menunjuk nomor elemen array yang menampung isi stack yang paling
b. Beberapa Kondisi Stack.
Ditentukan oleh posisi Pointer Top
1. Stack kosong tak ada Isinya (awal)
0 1 2 3 4 5 n
S[ ] …. ….
Dasar Top
STACK dalam kondisi : Kosong Top = 0 Bisa Diisi Top<n
2. Stack penuh tak bisa diisi
0 1 2 3 4 5 6 7 8
S[ ] X X X X X X X X
Dasar Top STACK dalam kondisi :
Penuh Top = n Ada isinya Top>0
3. Stack bisa diisi
0 1 2 3 4 5 n
S[ ] X X X X …. …. …. ….
Dasar Top STACK dalam kondisi :
Bisa diisi Top < n Ada isinya Top > 0
KONDISI STACK CIRI
1 KOSONG, tak ada isinya Top = 0
2 PENUH, tak bisa di isi Top = n
3 BISA DI ISI, (kebalikan penuh) Top < n
4 ADA ISINYA (kebalikan kosong) Top > 0
c. Proses
a. AWAL ( Inisialisasi)
b. PUSH ( Simpan, insert ,Tulis ) c. POP (Ambil, Delete, Baca )
Algoritma Proses Awal Stack (Bhs. C++)
Dimana semua pointer Dasar dan Top dimulai dari 0
void Awal(void) {
dasar = 0; Top = 0; }
Algoritma dasar proses Push (simpan)
- Naikkan Top dengan 1
- Isikan data kedalam elemen yang ditunjuk Top
void Push(void) {
Top = Top + 1; S[Top] = X; }
Algoritma Lengkap proses Push (simpan)
- Periksa dahulu apakah Top<n - Naikkan Top dengan 1
- Isikan data kedalam elemen yang ditunjuk Top - Jika Sudah penuh cetak “Stack Penuh Boy”
void Push(void) { if ( Top<n ) { Top = Top + 1; S[Top] = X; } else
cout<<“Stack Penuh Boy”; }
Algoritma dasar proses Pop (ambil)
- Copy data dari elemen yang ditunjuk Top kedalam suatu Variabel - Turunkan Top void Pop(void) { X = S[Top]; Top = Top –1 ; }
Algoritma Lengkap proses Pop (Ambil) - Periksa dahulu apakah Top……… - ……… - ……….. - void Push(void) { if (…………) { ……… ……… } else ……… }
Stack II
Dua Stack dalam satu array.
Satu array digunakan oleh dua stack
Dimana Dasar Stack1 berada pada sisi index terkecil dan Dasar Stack2 berada Pada sisi index terbesar . Ilustrasi n = 12 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S[ ] a a a a b B b b
Dasar1 Top1 Top2 Dasar 2
0 4 13 9
Dasar1 Top1 Dasar2 Top2
Dasar1 selalu = 0
Dasar2 selalu = n+1
Untuk Ilustrasi diatas Dasar2 selalu = 13
a. Beberapa Kondisi Stack.
1. Stack kosong tak ada Isinya (awal)
n 0 1 2 3 4 5 6 7 8 9 10 11
S[ ]
Dasar1 Top1 Dasar2 Top2
Kondisi Awal :
- Stack 1 Kosong dan bisa di isi - Stack 2 Kosong dan bisa di isi
Cirinya :
Dasar1 =0 , Top1=0
Dasar2 = n + 1 , Top2 = n + 1
2. Stack1 dan Stack2 ada Isinya
0 1 2 3 4 5 6 7 8 9 10 11 S[ ]
a a a a b b b
Dasar1 Top1 Top2 Dasar 2 Stack1 ada isinya dan bisa di isi
Stack2 ada isinya dan bisa di isi
Cirinya :
Dasar1 = 0 , Dasar2= n + 1 Masih bisa diisi Top2 – Top1 >1
3. Stack Penuh
0 1 2 3 4 5 6 7 8 9 10 11 S[ ]
a a a a a a b b b b b
Dasar1 Top1 Top2 Dasar 2 Stack1 dan Stack2 Tak bisa di isi
Cirinya : Top2 – Top1 = 1 4 Stack Penuh n 0 1 2 3 4 5 6 7 8 9 10 11 S[ ] a a a a a a a a a a a
Stack1 ada isinya Stack2 tak ada isinya
Cirinya :
Top1 = n
Dasar2= n + 1 , Top2 = n + 1
KONDISI STACK CIRI
1 STACK1 KOSONG
STACK2 KOSNG
Top1= 0 Top2 = n +1
2 STACK1 DAN STACK 2 PENUH Top2 – Top1 =1
3 STACK1 DAN STACK2 BISA DIISI Top2 – Top1 > 1
4 STACK1 ADA ISINYA
STACK2 ADA ISINYA
Top1 > 0 Top2 < n + 1 b. Proses - Awal (Inisialisasi) - Push1 - Pop1 - Push2 - Pop2
Algoritma Proses Awal Stack( Bhs. C )
void Awal(void) { Dasar1 = 0; Top1 = 0; Dasar2 = n + 1; Top2 = n +1 }
Algoritma dasar proses Push1 (simpan)
- Naikkan Top dengan 1
- Isikan data kedalam elemen yang ditunjuk Top
void Push1(void)
{ Top1 = Top1 + 1; S[Top1] = X; }
Algoritma Lengkap proses Push1 (simpan)
- Periksa dahulu apakah Top2-Top1>1 - Naikkan Top dengan 1
- Isikan data kedalam elemen yang ditunjuk Top - Jika Sudah penuh cetak “Stack Penuh Boy”
void Push1(void) { if ( Top2-Top1>1 ) { Top1 = Top1 + 1; S[Top1] = X; } else
printf(“Stack Penuh Boy”) }
Algoritma dasar proses Pop1(ambil)
- Copy data dari elemen yang ditunjuk Top1 kedalam suatu Variabel - Turunkan Top1 void Pop1(void) { X = S[Top1]; Top1 = Top1 –1 ; }
Algoritma Lengkap proses Pop1 (Ambil)
- Periksa dahulu apakah Top……… - ……… - ……….. void Push1(void) { if (…………) { ……… ……… } else
……… }
Buat Procedure untuk Push2 dan Pop2
Stack III
Dua Stack dalam satu array.
Satu array digunakan oleh dua stack
Dimana Dasar kedua Stack berada ditengah .
Ilustrasi n = 13 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S[ ] a a a a B b b b
Top1 Dasar2 Dasar 1 Top2
7 3 6 10
Dasar1 Top1 Dasar2 Top2
Dasar1 selalu = div(n,2) +1 Dasar2 selalu = div(n,2)
Contoh fungsi div :
div(15,3) -- hasilnya 5 div(16,3) -- hasilnya 5 div(17,3) -- hasilnya 5
a. Beberapa kondisi Stack 1. Kondisi Awal n = 13 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S[ ] Top2 Dasar2 Dasar1 Top1 Ciri : Dasar1 = div(n,2) + 1 Top1 = div(n,2) + 1 Dasar2 = div(n,2) Top2 = div(n,2)
Stack1 masih bisa di isi Top1>1 Stack2 masih bis diisi Top2 < n
2. Stack ada isinya
n = 13 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S[ ] a a a a b b b b
Top1 Dasar2 Dasar 1 Top2
Cirinya
Stack1 masih bisa di isi Top1>1 Stack2 masih bis diisi Top2 < n
3. Stack penuh n = 13 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S[ ] a a a a a a b b b b b b b
Top1 Dasar2 Dasar 1 Top2
Stack1 dan Stack2 penuh
Cirinya
Top1 = 1 Top2 = n
KONDISI STACK CIRI
1 STACK1 KOSONG STACK2 KOSNG Top1= div(n,2) +1 Top2= div(n,2) 2 STACK1 PENUH STACK 2 PENUH Top1 = 1 Top2 = n 3 STACK1 BISA DIISI
STACK2 BISA DIISI
Top1 > 1 Top2 < n
4 STACK1 ADA ISINYA
STACK2 ADA ISINYA
Top1< div(n,2) + 1 Top2 > div(n,2) b. Proses - Awal (Inisialisasi) - Push1 - Pop1 - Push2 - Pop2
Buat Procedure dalam Bhs C++ - Awal (Inisialisasi) - Push1
- Pop1 - Push2 - Pop2
Praktikum
Anda diminta untuk membuat suatu program animasi stack dengan 4 buah pilihan : push, pop, cetak stack , quit
Jika dipilih push maka program akan meminta user untuk menginput sebuah character yang akan dimasukkan kesebuah wadah.
Jika dipilih pop maka character teratas akan dikeluarkan dari wadah.
Jika dipilih cetak stack maka komputer akan menampilkan character yang ada pada wadah. Jika dipilih quit maka program keluar.
LAYOUT ANIMASI STACK 1. PUSH 2. POP 3. CETAK STACK 4. QUIT PILIH 1 – 4 : 1
Masukkan sebuah huruf : B
M E R C U
Daftar Pustaka
1. Pengantar Struktur Data dan Algoritma, Bambang Wahyudi, Penerbit Andi Yogyakarta, Edisi 1, 2004
2. Struktur Data dengan C, Paulus Bambangwirawan Dipl.Inf, Penerbit Andi Yogyakarta, Edisi 1, 2004
3. Pengantar Algoritma dengan Bahasa C, Thompson Susabda Ngoen, Penerbit Salemba Teknika, Edisi 1, 2004
4. Pemrograman C++, Abdul Kadir, Penerbit Andi Yogyakarta, Edisi 1, 2002 5. Struktur Data dengan C, C++, Moh. Sjukani, Mitra Wacana Media, Edisi 4
MODUL PERKULIAHAN
Algoritma
Pemrograman &
Struktur Data
Pertemuan 5
QUEUE (ANTRIAN)
Fakultas Program Studi Tatap Muka Kode MK Disusun Oleh
Ilmu Komputer Teknik Informatika
05
87031 Tim DosenAbstract
Kompetensi
Membahas tentang konsep dari queue (antrian) dan penerapannya
Mampu memahami konsep dasar dari queue (antrian) dan penerapannya
QUEUE (ANTRIAN)
Bentuk Antrian
Ada 3 Bentuk Queue yang akan dibahas : 1. Linier Queue
2. Circuler Queue 3. Double Ended Queue
Mengunakan array satu dimensi
Antrian Lurus (Linier Queue)
Prinsip :FIFO ( FIRST IN FIRST OUT )
FCFS ( FIRST COME FIRST SERVE )
Yang lebih awal masuk akan dilayani terlebih dahulu
ILUSTRASI misal n = 10 n 0 1 2 3 4 5 6 7 8 9 10 Q[ ] X X X F R Menggunakan Pointer F dan R
F ( Front ) untuk awal antrian R ( Rear ) untuk akhir antrian
Untuk pengambilan data (keluar data) menggunakan Pointer F Untuk pemasukan data menggunakan pointer R
Dari ilustrasi diatas :
R = 5, artinya pernah masuk 5 pengantri yang menempati 5 elemen dengan urutan masuk mulai Q[1], Q[2],…….. Jadi yang terkahir masuk sekarang berada di Q[5]
F = 2, artinya sudah keluar(sudah dilayani) sebanyak 2 pengantri dengan urutan keluar atau dilayani mulai dari Q[1], Q[2] jadi yang terakhir keluar adalah yang berada di Q[2]
a. Kondisi Antrian
1. Kondisi Awal (belum ada yang ngantri)
misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ] F = R = 0 Kondisi awal F = R antrian Kosong
F R R< n antrian bisa di isi
2. Masuk 4 Pengantri/Belum ada yang keluar
misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ] X X X X
F = 0 Belum ada yang keluar F < R antrian ada isinya
F R R< n antrian bisa di isi
3 Misal Keluar/dilayani 3 pengantri dan belum ada yang masuk misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ] X F = 3 Sudak keluar 3 F < R antrian ada isinya
4. Misal masuk lagi 2 Pengantri misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ] X X X F R
F<R antrian ada isinya R< n antrian bisa di isi 5. Misal sesudah itu keluar 3 (semua) pengantri
misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ] F = R antrian KOSONG F R
R < n antrian bisa di isi
6. Misal masuk lagi 4 Pengantri
misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ]
X X X X
F < R antrian ADA ISINYA
R = n antrian Penuh F R
7. Misal Keluar/dilayani 4 (Semua ) Pengantri
misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ] F = R antrian Kosong R = n antrian Penuh F R
Dapat juga disebut penuh karena tak bisa di isi Untuk keadaan ini perlu dilakukan RESET yaitu : Mengembalikan pointer keposisi awal F=0 dan R=0
8. Kondisi Penuh sesungguhnya
misal n = 10 0 1 2 3 4 5 6 7 8 9 10 n Q[ ] X X X X X X X X X X F R
F = 0 Belum ada yang dilayani R = n antrian Penuh
KONDISI ANTRIAN CIRI
1 KOSONG F = R dimana saja
2 PENUH R = n
3 BISA DI ISI R < n
4 ADA ISINYA F < n
5 PERLU DI RESET F = R = n
b. Proses yang dapat dilakukan a. AWAL (Inisialisasi)
b. INSERT ( Sisip, Masuk, Simpan, ngantri) c. DELETE (Hapus, Keluar, Ambil, dilayani) d. RESET ( Kembali Keadaan Awal)
Untuk Proses INSERT menggunakan Pointer R ( Rear ) Untuk Proses DELETE menggunakan Pointer F ( Front )
ALGORITMA DASAR PROSES AWAL (INISIALISASI)
Dimana Pointer F dan R bernilai 0 void AWAL(void)
{
F = 0; R = 0; }
ALGORITMA DASAR PROSES INSERT (MASUK)
- Pointer R maju 1 langkah
- Kemudian Isikan data kedalam elemen yang ditunjuk oleh R void INSERT(void) { R = R +1 ; Q[R]=X; }
ALGORITMA DASAR PROSES DELETE (HAPUS)
- Pointer F maju 1 langkah
- Kemudian Copy data dari Elemen yang ditunjuk oleh F ke suatu Variabel.
void DELETE(void) {
F = F + 1 ; X =Q[F]; }
A. BUAT PROC. LENGKAP UNTUK PROC. INSERT DAN DELETE
CIRCULAR QUEUE ( Antrian Melingkar ) ILUSTRASI n 1 2 3 4 5 6 7 8 9 10 Q[ ] X X X X F R F = Front (Depan) R = Rear (Belakang)
Arah antrian tetap sama dengan antrian biasa, hanya saja setelah sampai ke elemen ke-n akan kembali ke elemen 1 tanpa harus di RESET.
Karena melingkar maka F dan R dapat saling menyusul :
F TIDAK SELALU <= R
a. Proses yang dapat dilakukan : a. AWAL (Inisialisasi)
b. INSERT (Masuk, Simpan, Tulis) c. DELETE (Hapus, Keluar, ambil, Baca)
b. Beberapa Kondisi Antrian 1. Keadaan AWAL n 1 2 3 4 5 6 7 8 9 10 Q[ ] Flag = 0 F R
KONDISI ARTINYA
1 F = R dan Flag = 0 Kosong, Bisa di isi
2 Atau cukup Flag = 0 Kosong Bisa di isi
Flag 0 ---- artinya tidak ada data Flag 1 ---- artinya ada datanya
2. Masuk 1 Pengantri n 1 2 3 4 5 6 7 8 9 10 Q[ ] X Flag = 1 R F KONDISI ARTINYA 1 F != R Ada isinya
2 Flag = 1 Ada isinya
3 F != R Bisa di isi
Catatan : != (Tidak sama dengan)
3. Masuk Lagi 3 Pengantri
n 1 2 3 4 5 6 7 8 9 10 Q[ ] X X X X Flag = 1 R F KONDISI ARTINYA 1 F != R Ada isinya
2 Flag = 1 Ada isinya
4. Keluar 1 Pengantri n 1 2 3 4 5 6 7 8 9 10 Q[ ] X X X Flag = 1 F R KONDISI ARTINYA 1 F != R Ada isinya
2 Flag = 1 Ada isinya
3 F != R Bisa di isi
5. Keluar 3 ( Semua ) Pengantri
n 1 2 3 4 5 6 7 8 9 10 Q[ ] Flag = 0 F R KONDISI ARTINYA
1 F = R and Flag = 0 Kosong
2 Flag = 0 Kosong
3 Flag = 0 Bisa di isi
Jika yang didelete elemen yang ditunjuk oleh R maka Flag langsung dibuat = 0; 6. Kemudian masuk 8 Pengantri
n 1 2 3 4 5 6 7 8 9 10 Q[ ] X X X X X X X X Flag = 1 R F
KONDISI ARTINYA
1 F != R Ada isinya
2 Flag = 1 Ada isinya
3 F != R Bisa di isi
7. Masuk Lagi 2 Pengantri
n 1 2 3 4 5 6 7 8 9 10 Q[ ] X X X X X X X X X X Flag = 1 R F KONDISI ARTINYA
1 F = R DAN Flag = 1 Penuh, Ada isinya
2 Flag = 1 Ada isinya
KONDISI ANTRIAN CIRI
1 KOSONG F = R dan Flag = 0
Atau cukup dengan Flag = 0
2 PENUH F = R dan Flag = 1
3 BISA DI ISI F != R atau Flag = 0
4 ADA ISINYA F!=R atau Flag = 1
Atau cukup Flag = 1
ALGORITMA PROSES AWAL
Pointer F dan R berada di n dan Flag=0 (tak ada isinya) void AWAL(void) { F = n; R = n; Flag = 0; }
Untuk Proses INSERT menggunakan Pointer R ( Rear ) Untuk Proses DELETE menggunakan Pointer F ( Front )
Algoritma Dasar Proses Insert - R maju 1 Langkah
- Kemudian Isikan data kedalam elemen yang ditunjuk oleh R - Isi Flag dengan 1
void INSERT(void) { R = fmod(R,n) + 1; Q[R] = X; Flag =1 }
R = fmod(R,n) + 1, maksudnya : R maju satu langkah, dengan ketentuan jika R berada pada posisi di n maka setelah maju satu langkah akan menjadi R = 1
Fungsi fmod( ) dalam bhs C. adalah untuk mencari nilai sisa dari pembagian. Contoh :
fmod(10,3) --- hasilnya 1 fmod(3,10) --- hasilnya 3 fmod(10,10) ---- hasilnya 0 fmod(2,10) --- hasilnya 2
Algoritma Dasar Proses Delete - F maju 1 Langkah
- Kemudian Copy data dari Elemen yang ditunjuk oleh F ke suatu Variabel. - Isi Flag dengan 0
void DELETE(void) { F = fmod(F,n) + 1; X = Q[F]; If F=R { Flag =0; } }
DOUBLE ENDED QUEUE ( DEQUE ) Antrian dengan ujung ganda
ILUSTRASI
n
Insert Kiri 1 2 3 4 5 6 7 8 9 10 insert Kanan
D[ ]
10 15 23
Delete Kiri Delete Kanan
L R
- Pengantri dapat masuk dari pintu kanan atau kiri
- Yang masuk dari pintu kiri, dapat keluar dari pintu kiri atau keluar dari pintu kanan tergantung kesempatan yang ada.
- Yang masuk dari pintu kanan dapat keluar dari pintu kanan atau keluar dari pintu kiri tergantung dari kesempatan yang ada.
Pointer yang digunakan:
L = LEFT (Kiri) digunakan untuk insert dan delete kiri R = Right(kanan) digunakan untuk insert dan delete kanan PROSES YANG DAPAT DILAKUKAN
- Insert Kiri : Masuk dari pintu kiri - Insert Kanan : Masuk dari pintu kanan - Delete kiri : Keluar dari pintu kiri - Delete kanan : Keluar dari pintu kanan
Syarat : L tidak boleh mendahului R L <= R
Prinsip : Bukan FIFO bukan juga LIFO, tetapi keluar dan masuk dari kedua ujungnya sesuai dengan kesempatan yang ada.
a. Beberapa Kondisi Antrian
1. Keadaan AWAL (Inisial)
0 1 2 3 4 5 6 7 n D[ ]
1 2 3 ………..
L R Insert Kanan
L=R=0 Pada Kondisi ini hanya bisa insert kanan
2. Insert Kanan Sebanyak 3 elemen
0 1 2 3 4 5 6 7 n D[ ] X X X
L R
Insert Kanan
Delete kiri delete kanan
Pada Kondisi ini :
L = 0 (dianggap penuh kiri) R = 3 ,
- tidak bisa insert kiri,
- hanya bisa Delete kiri, insert kanan dan delete kanan
3. Delete Kiri 2 elemen
0 1 2 3 4 5 6 7 n
D[ ] X
L R
Pada Kondisi ini :
L = 2 R = 3 :
- Bisa insert kiri dan insert kanan - Bisa delete kiri dan delete kanan
4. Insert Kanan sebanyak n
0 1 2 3 4 5 6 7 n
D[ ] X X X X X X X X
L R Pada Kondisi ini :
L = 2
R = n (Penuh Kanan) - tak bisa insert kanan
5. Insert Kiri sebanyak 2 elemen
0 1 2 3 4 5 6 7 n
D[ ] X X X X X X X X X X
L R Pada Kondisi ini :
L = 0 (Penuh kiri)
R = n (Penuh Kanan) - tak bisa insert kiri dan kanan
6. Delete kanan sampai R = 4
0 1 2 3 4 5 6 7 n D[ ] X X X X
L R Pada Kondisi ini :
L = 0 (Penuh kiri)
R = 4 (Penuh Kanan) - tak bisa insert kiri
7. Delete kiri 4 Elemen
0 1 2 3 4 5 6 7 n D[ ]
L R Pada Kondisi ini :
L = 4, R = 4
Pada posisi mana saja jika L = R maka antrian Kosong
KONDISI ANTRIAN CIRI
1 AWAL L = R = 0
2 KOSONG L = R dimana saja
3 PENUH KIRI PENUH KANAN PENUH SEBENARNYA L = 0 R = n L = 0 dan R = n 4 ADA ISINYA L <> R atau L < R
ALGORITMA PROSES AWAL (INISILISASI)
Pointer L dan R berada di 0
void AWAL(void) {
L = 0; R = 0; }
ALGORITMA DASAR PROSES INSERT KANAN(MASUK KANAN)
- Pointer R maju 1 langkah
void INSERT_KANAN(void) { R = R +1 ; D[R]=X; }
ALGORITMA DASAR PROSES DELETE KANAN(HAPUS KANAN)
- Copy data dari Elemen yang ditunjuk oleh R ke suatu Variabel. - Mundur R sebanyak 1 void DELETE_KANAN(void) { X = D[R]; R = R - 1 ; }
1. Buat algoritma dasar Insert kiri dan delete kiri
Praktikum
Soal 1
Anda diminta untuk membuat suatu program animasi ANTRIAN LURUS dengan 4 buah pilihan : MASUK, KELUAR, LIHAT ANTRIAN , QUIT.
Jika dipilih MASUK maka program akan meminta user untuk menginput sebuah character yang akan dimasukkan kesebuah wadah.
Jika dipilih KELUAR maka character pertama masuk akan dikeluarkan dari wadah.
Jika dipilih LIHAT ANTRIAN maka komputer akan menampilkan character antrian yang ada pada wadah.
Jika dipilih QUIT maka program keluar.
LAYOUT ANIMASI ANTRIAN 1. MASUK 2. KELUAR 3. LIHAT ANTRIAN 4. QUIT PILIH 1 – 4 : 1
Masukkan sebuah huruf : M
M E R C U