Saturday, November 8, 2014

STRUKTUR DATA PERTEMUAN 3

BAB 3

STACK DAN QUEUE


1.       STACK

A.     DAFTAR LINEAR


                        Sebuah daftar linear atau linear list, merupakan suatu struktur data umum yang terbentuk dari barisan hingga (yang terurut) dari satuan data ataupun dari record. Untuk mudahnya, elemen yang terdapat di dalam daftar disebut dengan simpul atau node. Daftar disebut linear (lurus), karena elemen tampak seperti berbaris, yakni bahwa setiap simpul, kecuali yang pertama dan yang terakhir, selalu memiliki sebuah elemen penerus langsung (suksesor langsung) dan sebuah elemen pendahulu langsung (predesesor langsung).

                        Di sini, banyak simpul atau elemen, tersebut dapat berubah – ubah, berbeda dengan array yang banyak elemennya selalu tetap. Kita menyatakan linear list A yang mengandung T elemen pada suatu saat, sebagai A = [A1, A2, … AT]. Jika T = 0, maka A disebut list hampa atau null list.

                        Suatu elemen dapat dihilangkan atau dihapus (deletion) dari sembarang posisi dalam linear list, dan suatu elemen baru dapat pula dimasukkan (insertion) sebagai anggota list pada posisi sembarang (di mana saja).

                        File, merupakan salah satu contoh dari daftar linear yang elemen-elemennya berupa record. Selain file, contoh lain dari daftar linear adalah stack atau tumpukan, queue atau antrean, dan daftar berkait atau linear linked list atau one-way list. Pada Bab 3 ini kita bahas tentang stack tersebut.

B.     STACK atau TUMPUKAN


            Stack atau tumpukan adalah bentuk khusus dari liniear list. Pada stack, penghapusan serta pemasukan elemennya hanya dapat dilakukan di satu posisi, yakni posisi akhir dari list. Posisi ini disebut puncak atau top dari stack. Elemen stack S pada posisi ini dinyatakan dengan TOP(S).

            Jelasnya, bila stack S [S1, S2, …, ST], maka TOP(S) adalah ST. Banyaknya elemen stack S pada suatu saat tertentu biasa kita sebut sebagai NOELS(S). Jadi untuk stack kita di atas, NOEL(S) = T.  Seperti halnya pada semua linear list, pada stack dikenal operasi penghapusan dan pemasukan.

            Operator penghapusan elemen pada stack disebut POP, sedangkan operator pemasukan elemen, disebut PUSH. Untuk menggambarkan kerja kedua operator di atas, berikut ini suatu contoh bermula dari stack hampa S [], yang kita gambar sebagai :
 

Mula-mula kita PUSH elemen A, diperoleh Stack S = [A] 


Apabila kemudian kita PUSH elemen B, diperoleh Stack S = [A, B]

 
Selanjutnya bila PUSH elemen C, diperoleh Stack S = [A,B,C]

Kemudian bila kita POP elemen C, diperoleh Stack S = [A.B]


Kita dapat pula PUSH 2 elemen D dan E. Akan dihasilkan Stack S = [A,B,D,E]
 
            Terlihat bahwa kedua operasi di atas, pada stack adalah bersifat ‘terakhir masuk pertama keluar’ atau ‘last in first out (LIFO)’. Pada hakekatnya kita tidak membatasi berapa banyak elemen dapat masuk ke dalam stack. Untuk suatu stack S[S1, S2, …, SNOEL], kita katakana bahwa elemen Si, berada di atas elemen Sj, jika I lebih besar dari j. Suatu elemen tidak dapat kita POP ke luar, sebelum semua elemen di atasnya dikeluarkan.

C.     OPERASI PADA STACK


            Terdapat empat operasi pada stack, yakni CREATE (stack), ISEMPTY (stack), PUSH (elemen, stack), dan POP (stack). CREATE(S) adalah operator yang menyebabkan stack S menjadi satu stack hampa. Jadi NOEL (CREATE(S)) adalah 0, dan TOP (CREATE(S)) tak terdefinisi.

            Sedangkan operator ISEMPTY(S) bermaksud memeriksa apakah stack S hamper atau tidak. Operandnya adalah data bertipe stack, sedangkan hasilnya merupakan data bertipe Boolean. ISEMPTY(S) adalah true, jika S hampa, yakni bila NOELS(S) = 0, dan false dalam hal lain. Jelas bahwa ISEMPTY(CREATE(S)) adalah true.

            Operator PUSH (E,S) akan bekerja menambahkan elemen E pada stack S. E ditempatkan sebagai TOP(S). Operator POP(S) merupakan operator yang bekerja mengeluarkan elemen TOP(S) dari dalam stack. POP(S) akan mengurangi nilai NOEL(S) dengan 1. Suatu kesalahan akan terjadi apabila, kita mencoba melakukan POP(s) terhadap stack S yang hampa

            Kesalahan overflow akan terjadi, jika kita melakukan operasi pemasukan data (PUSH) pada stack yang sudah penuh (dalam hal ini jika banyaknya elemen yang kita masukan ke dalam sebuah stack sudah melampaui batas kemampuan memori atau telah didefinisikan sebelumnya).

            Sebaliknya, kesalahan underflow akan terjadi jika stack sudah dalam keadaan hampa, kita lakukan operasi pengeluaran atau penghapusan (POP).

2.       QUEUE

A.     PENGERTIAN QUEUE (ANTREAN)

            Struktur data antrean atau queue adalah suatu bentuk khusus dari linear list, dengan operasi penyisipan (insertion) hanya di perbolehkan pada salah satu sisi, yang disebut sisi belakang (REAR), dan operasi penghapusan (deletion) hanya diperbolehkan pada sisi lainnya, yang disebut sisi depan (FRONT), dari list.

            Sebagai contoh dapat kita lihat antrean (Q1, Q2, …, Qn). Kita notasikan bagian depan dari antrian Q sebagai FRONT(Q) dan bagian belakang sebagai REAR(Q).

            Jadi untuk antrean Q = [Q1, Q2, …, Qn] :

                        FRONT(Q) = Q1 dan REAR(Q)= Qn

            Kita menggunakan notasi NOEL(Q) untuk menyatakan jumlah elemen di dalam antrean Q. NOEL(Q) mempunyai harga integer. Untuk antrean Q = [Q1Q2, . . ., Qn], maka NOEL(Q) = N.

            Operator penyisipan (insertion) disebut INSERT dan operator penghapusan (deletion) disebut REMOVE.

            Sebagai contoh untuk memperjelas bekerjanya antrean, kita perhatikan sederetan operasi berikut. Kita mulai dengan antrean hampa Q. Antrean hampa Q, atau Q[] dapat di sajikan seperti terlihat pada gambar di bawah ini :

Di sini :
            NOEL(Q) = 0
            FRONT(Q) = tidak terdefinisi
            REAR(Q) = tidak terdefinisi

Lalu kita INSERT elemen A, diperoleh Q = [A], seperti terlihat di gambar ini :
 
Disini :
            NOEL(Q) = 1
            FRONT(Q) = A
            REAR(Q) = A

            Dilanjutkan dengan INSERT elemen B, sehingga diperoleh Q = [A,B], seperti terlihat di bawah ini :

Di sini ;
            NOEL(Q) = 2
            FRONT(Q) = A
            REAR(Q) = B

            Dilanjutkan dengan INSERT elemen C, sehingga diperoleh Q = [A, B, C], seperti terlihat di bawah ini :
Di sini :
            NOEL(Q) = 3
            FRONT(Q) = A
            REAR(Q) = C

            Dilanjutkan dengan DELETE satu elemen dari Q, sehingga diperoleh Q = [B, C], seperti terlihat di bawah ini :
Di sini :
            NOEL(Q) = 2
            FRONT(Q) = B
            REAR(Q) = C

            Demikian seterusnya, kita dapat melakukan serangkaian INSERT dan DELETE yang lain. Suatu kesalahan underflow dapat terjadi, yakni apabila kita melakukan penghapusan pada antrean hampa. Antrean dikatakan beroprasi dalam cara FIRST-IN-FIRST-OUT (FIFO). Disebut demikian karena elemen yang pertama masuk merupakan elemen yang pertama ke luar.

            Model antrean, sangat sering ditemukan dalam kejadian sehari-hari, seperti mobil yang menunggu untuk pengisian bahan bakar, mobil pertama dari antrean merupakan mobil pertama yang akan keluar dari antrean. Sebagai contoh lain adalah orang yang menunggu dalam antrean di suatu bank. Orang pertama yang berada di dalam barisan tersebut akan merupakan orang pertama yang akan dilayani.

B.     OPERASI DASAR PADA ANTREAN

Ada 4 operasi dasar yang dapat dilakukan pada struktur data antrean, yakni :
a)      CREATE(antrean)
b)      ISEMPTY(antrean)
c)      INSERT(elemen,antrean)
d)      REMOVE(antrean)

Pandang misalnya antrean Q = [Q1, Q2, …, QNOEL], maka :

CREAT(antrean) :

CREAT(Q) adalah suatu operator untuk membentuk dan menunjukkan suatu antrean hampa Q.

Berarti :
                                    NOEL(CREATE(Q)) = 0
                                    FRONT(CREATE(Q))= tidak terdefinisikan
                                    REAR(CREATE(Q)) = tidak terdefinisikan

ISEMPTY (antrean)
ISEMPTY(Q) adalah operator yang menentukan apakah antrean Q hampa atau tidak. Operand dari operator ini merupakan antrean, sedangkan hasilnya merupakan tipe data Boolean.

Di sini :
                                    ISEMPTY (antrean) = true, jika Q hampa, yakni jika NOEL(Q)=0
                                                                        = false, dalam hal lain.
                        Maka, ISEMPTY(CREATE(Q)) = true

INSERT(elemen, antrean)
INSERT(E,Q) adalah operator yang memasukkan elemen E ke dalam antrean Q. Elemen E ditempatkan di bagian belakang dari antrean. Hasil dari operasi ini adalah antrean yang lebih panjang.

                        REAR(INSERT(E,Q)) = E
                                    QNOEL adalah E
                                    ISEMPTY(INSERT(E,Q)) = false

REMOVE (antrean)
REMOVE(Q) adalah operator yang menghapus elemen bagian depan dari Antrean Q. Hasilnya merupakan antrean yang lebih pendek. Pada setiap operasi ini, harga dari NOEL(Q) berkurang satu, dan elemen kedua dari Q menjadi elemen terdepan.

                        Jika NOEL(Q) = 0, maka REMOVE(Q) memberikan suatu kondisi error, yakni suatu underflow. Jelas bahwa REMOVE(CREATE(Q)) juga memberikan kondisi underflow error.