POINTER STACK DAN QUEUE ALGORITMA DAN STRUKTUR DATA Institut Teknologi Sumatera
PRE TEST Apakah yang disebut dengan array? Bagaimana cara deklarasi dan pengacuan dari sebuah array? Apa kekurangan array?
POINTER Merupakan variabel yang menyimpan alamat (referensi) dari nilai lain Berbeda dengan variabel biasa yang menyimpan nilai miliknya sendiri x 13 13 int x; x px int *px; px = &x; /* operator reference to */
CONTOH #include <stdio.h> int main(){ int x; int *px; x = 12; printf("alamat x : %d", &x); printf("\n"); printf("nilai x : %d", x); printf("\n"); px = &x; } printf("\n"); printf("variabel px berisi alamat x, yaitu : %d", px); printf("\n"); printf("nilai yg diacu variabel px adalah : %d", *px);
SUB PROGRAM Blok program yang merupakan sekumpulan instruksi yang bertujuan untuk menyelesaikan suatu tugas khusus. Sebuah sub progam dibuat untuk membantu mengerjakan tugas yang kompleks secara efektif dan efisien.
PASSING PARAMETER Passing by value Passing by reference
PASSING PARAMETER BY REFERENCE Mengatur masukan dari sebuah sub program, agar nilai dari variabel asli bisa dimodifikasi. Parameter input sub program adalah alamat memori dari variabel sebenarnya.
PASSING BY VALUE VS. PASSING BY REFERENCE #include <stdio.h> void ubah(int sesuatu){ sesuatu = sesuatu + 100; } int main(){ int x; x = 50; printf("nilai x sebelum diubah : %d", x); ubah(x); VS #include <stdio.h> void ubah(int *sesuatu){ *sesuatu = *sesuatu + 100; } int main(){ int x; x = 50; printf("nilai x sebelum diubah : %d", x); ubah(&x); } printf("\n"); printf("nilai x setelah diubah : %d", x); } printf("\n"); printf("nilai x setelah diubah : %d", x);
PROSEDUR TUKAR #include <stdio.h> int main(){ int bil_1, bil_2; printf("input bilangan 1 : "); scanf("%d",&bil_1); printf("input bilangan 2 : "); scanf("%d",&bil_2); printf("\n\n"); printf("nilai sebelum ditukar\n"); printf("bilangan 1: %d", bil_1); printf("\n"); printf("bilangan 2: %d", bil_2); tukar(&bil_1, &bil_2); void tukar(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp; } } printf("\n\n"); printf("nilai setelah ditukar\n"); printf("bilangan 1: %d", bil_1); printf("\n"); printf("bilangan 2: %d", bil_2);
STACK Stack: list linier yang: dikenali elemen puncaknya (TOP) aturan penyisipan dan penghapusan elemennya tertentu: Penyisipan selalu dilakukan "di atas" TOP Penghapusan selalu dilakukan pada TOP TOP adalah satu-satunya alamat tempat terjadi operasi Elemen Stack tersusun secara LIFO (Last In First Out)
STACK TOP TOP BOTTOM BOTTOM Representasi tabel sangat tepat untuk mewakili Stack Pada Stack : operasi penambahan dan pengurangan hanya dilakukan di salah satu ujung tabel Pada Tabel: operasi boleh di manapun.
PEMAKAIAN STACK Pemanggilan prosedur Perhitungan ekspresi aritmatika Rekursifitas Backtracking dan algoritma lanjut yang lain
DEFINISI FUNGSIONAL Jika diberikan S adalah Stack dengan elemen ElmtS: CreateEmpty : S { Membuat sebuah stack kosong} IsEmpty : S boolean { Test stack kosong, true jika stack kosong, false jika S tidak kosong } IsFull : S boolean { Test stack penuh, true jika stack penuh, false jika S tidak } Push : ElmtS x S S { Menambahkan sebuah elemen ElmtS sebagai TOP, TOP berubah nilainya } Pop : S S x ElmtS { Mengambil nilai elemen TOP, sehingga TOP yang baru adalah elemen yang datang sebelum elemen TOP, mungkin S menjadi kosong } 14
DEFINISI FUNGSIONAL Definisi Selektor: Jika S adalah sebuah Stack, maka Top(S) adalah alamat elemen TOP, di mana operasi penyisipan/penghapusan dilakukan InfoTop(S) adalah informasi yang disimpan pada Top(S) Definisi Stack kosong adalah Stack dengan Top(S)=Nil (tidak terdefinisi)
IMPLEMENTASI STACK DENGAN TABEL Ilustrasi Stack tidak kosong, dengan 5 elemen: Ilustrasi Stack kosong
QUEUE QUEUE adalah list linier yang: dikenali elemen pertama (HEAD) dan elemen terakhirnya (TAIL) aturan penyisipan dan penghapusan elemennya didefinisikan sebagai berikut: Penyisipan selalu dilakukan setelah elemen terakhir Penghapusan selalu dilakukan pada elemen pertama satu elemen dengan yang lain dapat diakses melalui informasi NEXT
QUEUE Elemen Queue tersusun secara FIFO (First In First Out) Pemakaian queue: antrian job yang harus ditangani oleh sistem operasi (job scheduling) antrian dalam dunia nyata
QUEUE Secara lojik: Head Tail Elemen Queue kosong HEAD QUEUE dengan 3 elemen TAIL HEAD TAIL HEAD TAIL QUEUE kosong QUEUE dengan 1 elemen
DEFINISI FUNGSIONAL Jika diberikan Q adalah QUEUE dengan elemen ElmtQ IsEmpty : Q boolean { Tes terhadap Q: true jika Q kosong, false jika Q tidak kosong } IsFull : Q boolean { Tes terhadap Q: true jika memori Q sudah penuh, false jika memori Q tidak penuh } NbElmt(Q) : Q integer { Mengirimkan banyaknya elemen Q } CreateEmpty : Q { Membuat sebuah antrian kosong } Add : ElmtQ x Q Q { Menambahkankan sebuah elemen setelah elemen ekor QUEUE } Del : Q Q x ElmtQ { Menghapus kepala QUEUE, mungkin Q menjadi kosong }
IMPLEMENTASI QUEUE DENGAN TABEL Memori tempat penyimpan elemen adalah sebuah tabel dengan indeks 1..IdxMax. IdxMax dapat juga dipetakan ke kapasitas Queue Representasi field Next: Jika i adalah address sebuah elemen, maka suksesor i adalah Next dari elemen Queue.
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF I Jika Queue tidak kosong: TAIL adalah indeks elemen terakhir, HEAD selalu diset = 1 Jika Queue kosong, maka HEAD = 0 dan TAIL = 0 Ilustrasi Queue tidak kosong dengan 5 elemen Ilustrasi Queue kosong:
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF I Algoritma penambahan elemen: Jika masih ada tempat, majukan TAIL Kasus khusus untuk Queue kosong: karena HEAD dan TAIL harus diset nilainya menjadi 1 Algoritma paling sederhana dan naif untuk penghapusan elemen Jika Queue tidak kosong: ambil nilai elemen HEAD, geser semua elemen mulai dari HEAD+1 s.d. TAIL (jika ada), kemudian TAIL mundur Kasus khusus untuk Queue dengan keadaan awal berelemen 1, yaitu menyesuaikan HEAD dan TAIL dengan DEFINISI Algoritma ini mencerminkan pergeseran orang yang sedang mengantri di dunia nyata, tapi tidak efisien
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF II Tabel dengan representasi HEAD dan TAIL, HEAD bergerak ketika sebuah elemen dihapus Jika Queue kosong, maka HEAD = 0 dan TAIL = 0 Ilustrasi Queue kosong:
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF II Ilustrasi Queue tidak kosong, dengan 5 elemen, kemungkinan pertama HEAD sedang berada di posisi awal: Ilustrasi Queue tidak kosong, dengan 5 elemen, kemungkinan lain HEAD tidak berada di posisi awal (akibat algoritma penghapusan)
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF II Algoritma penambahan elemen sama dengan alternatif I, kecuali pada saat penuh semu (lihat slide berikutnya) Algoritma penghapusan elemen: Jika Queue tidak kosong: ambil nilai elemen HEAD, kemudian HEAD maju Kasus khusus untuk Queue dengan keadaan awal berelemen 1, yaitu menyesuaikan HEAD dan TAIL dengan DEFINISI. Algoritma ini TIDAK mencerminkan pergeseran orang yang sedang mengantri di dunia nyata, tapi efisien
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF II Keadaan Queue penuh tetapi semu sebagai berikut: Harus dilakukan aksi menggeser elemen untuk menciptakan ruangan kosong Pergeseran hanya dilakukan jika dan hanya jika TAIL sudah mencapai IdxMax
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF III Tabel dengan representasi HEAD dan TAIL yang berputar mengelilingi indeks tabel dari awal sampai akhir, kemudian kembali ke awal Jika Queue kosong, maka HEAD=0 dan TAIL=0 Representasi ini memungkinkan tidak perlu lagi ada pergeseran yang harus dilakukan seperti pada alternatif II pada saat penambahan elemen
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF III Ilustrasi Queue tidak kosong, dengan 5 elemen, dengan HEAD sedang berada di posisi awal
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF III Ilustrasi Queue tidak kosong, dengan 5 elemen, dengan HEAD tidak berada di posisi awal, tetapi masih lebih kecil atau sebelum TAIL (akibat penghapusan/ penambahan)
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF III Ilustrasi Queue tidak kosong, dengan 5 elemen, HEAD tidak berada di posisi awal, tetapi lebih besar atau sesudah TAIL (akibat penghapusan/penambahan)
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF III Algoritma penambahan elemen: Jika masih ada tempat, majukan TAIL Jika TAIL sudah mencapai IdxMax, maka suksesor dari IdxMax adalah 1 sehingga TAIL yang baru adalah 1 Jika TAIL belum mencapai IdxMax, maka algoritma penambahan elemen sama dengan alternatif II Kasus khusus untuk Queue kosong karena nilai HEAD dan TAIL harus diset menjadi 1
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF III Algoritma penghapusan elemen Jika Queue tidak kosong: ambil nilai elemen HEAD, kemudian HEAD maju. Penentuan suatu suksesor dari indeks yang diubah/ maju dibuat seperti pada algoritma penambahan elemen: jika HEAD mencapai IdxMAx, maka suksesor dari HEAD adalah 1 Kasus khusus untuk Queue dengan keadaan awal berelemen 1, yaitu menyesuaikan HEAD dan TAIL dengan DEFINISI.
IMPLEMENTASI QUEUE DENGAN TABEL ALTERNATIF III Algoritma ini efisien karena tidak perlu pergeseran, dan seringkali strategi pemakaian tabel semacam ini disebut sebagai circular buffer, di mana tabel penyimpan elemen dianggap sebagai buffer Salah satu variasi dari representasi pada alternatif III: menggantikan representasi TAIL dengan COUNT (banyaknya elemen Queue)