Kamis, 30 Desember 2010

TREE



  TREE adalah suatu graph yang acyclic, simple, connected yang tidak mengandung loop.

General TREE


  ROOT Tree A ; suatu vertex dengan derajat masuk = 0.


  LEAF Tree A ; suatu vertex dengan derajat keluar = 0.

Tree A atas vertex-vertex : V1, V2, V3, ....... , Vn harus mempunyai :
1.   Satu root A       Root (A) =  V1
2.   Sisanya (V2 , V3, ........,Vn) dipartisi menjadi Tm subtree ; di mana : 0 m n-1







  LEVEL dari suatu vertex A dalam Tree A adalah LENGTH Path(P) (Root(A),A)

Dari gambar Tree A ;

         Tentukan level A :
                Length P(Root(A),A)
                Length P(B,A) = (B,A) = 1


         Tentukan level G :
                Length P(Root(A),G)
                Length P(B,G) = (B,I) (I,E) (E,G) = 3

  HIGH dari suatu tree A adalah level tertinggi ditambah 1.

  WEIGHT dari suatu tree A adalah jumlah leaf dalam tree A.

Contoh :   Dari Tree A ;  High Tree A = 3 + 1 = 4
                                          Weight Tree A = 5 (A,C,D,G,H)



BINARY TREE
     
  Binary Tree merupakan himpunan vertex-vertex yang terdiri dari 2 subtree (dengan disjoint) yaitu subtree kiri dan subtree kanan.


      Setiap vertex dalam binary tree mempunyai derajat keluar max = 2.





BINARY TREE TRANSVERSAL


Adalah proses menelusuri suatu Binary Tree sehingga sedemikian rupa setiap vertex dikunjungi hanya 1 kali.

3 aktivitas dalam Binary tree Transversal :
(1)       Visit the Root
(2)       Transverse the left subtree
(3)       Transverse the right subtree



Algoritma dalam Binary Tree Transversal :

1.         PRE-ORDER TRANSVERSAL
            a.         visit the root
            b.         tranverse the left subtree
            c.         tranverse the right subtree


2.         IN-ORDER TRANSVERSAL
            a.         tranverse the left subtree
            b.         visit the root
            c.         tranverse the right subtree

3.         POST-ORDER TRANSVERSAL
            a.         tranverse the left subtree
            b.         tranverse the right subtree
            c.         visit the root

Contoh :



BINARY SEARCH TREE
           
- suatu Binary Search Tree dari himpunan N record (N1, N2, N3 . . . Nn)
- adalah suatu Binary Tree yang setiap vertex-nya (sebut Ri) ditempati oleh Ni untuk i = 1,2,3 ... N.

Vertex-vertex dari Binary Tree tsb. diatur sedemikian rupa sehingga untuk setiap Ri harus memenuhi syarat sbb :
1.         Jika Rj = left (Ri) maka Nj < Ni
2.         Jika Rj = right (Ri) maka Nj > Ni

Contoh :
Diketahui key dari 7 record (K, M, L, N, P, O, Q)
Binary Search Tree dari 7 key diatas dapat dibentuk :

          

Operasi-operasi pada Binary Search Tree :
1.         Direct Search
2.         Sequential Search
3.         Insert Search
4.         Delete Search

ad.1. DIRECT SEARCH

untuk mencari vertex k dalam binary search tree dengan root=Ri ,
algoritmanya adalah sbb :
1. Jika tree kosong maka search tidak sukses
    (k tidak ada dalam binary search tree)
2. Jika k = Ni maka search sukses
    (k ada dalam binary search tree)
3. Jika k < Ni maka subtree kiri dari Ri ditelusuri dan Ri = left    
    (Ri) kemudia         kembali ke langkah 1.
4. jika k > Ni maka subtree kanan dari Ri ditelusuri dan Ri=right
    (Ri) kembali ke langkah 1.

Contoh :

Carilah Key M dalam Binary Tree berikut secara Direct Search.
Berapa langkah/perbandingan yang dibutuhkan untuk mencari Key M.

Bandingkan dengan rootnya, jika :
            - lebih besar maka cari ke kanan
            - lebih kecil maka cari ke kiri.


ad.2.   SEQUENTIAL SEARCH


untuk mencari vertex K dalam binary search tree dengan Root=Ri.
Algoritmanya menggunakan langkah-langkah : IN-ORDER Transversal (Left Visit Right)


Contoh :

Cari key M dalam Binary Tree berikut secara sequential.


            4 langkah :    K > A 
                                                F > A
                                                D > A
                                                A = A


ad. 4.  DELETE SEARCH

            dilihat dari  Link -list-nya.





BALANCED TREE
           
Suatu Binary Tree dimana untuk setiap Root Ri berlaku struktur subtree kiri = struktur subtree kanan.




Height Balanced tree belum tentu Balance Tree tapi Balance Tree sudah pasti height balance tree.



Selasa, 28 Desember 2010

Algoritma Sorting

Dalam ilmu komputer dan matematika, algoritma pengurutan(sort) adalah algoritma yang menempatkan unsur-unsur daftar dalam urutan tertentu. Perintah yang paling sering digunakan adalah nomor urut dan ketertiban leksikografis. Efisien sortasi penting untuk mengoptimalkan penggunaan algoritma lainnya (seperti pencarian dan menggabungkan algoritma) yang membutuhkan diurutkan daftar untuk bekerja dengan benar, melainkan juga sering berguna untuk canonicalizing data dan untuk menghasilkan output terbaca-manusia. Lebih formal, output harus memenuhi dua kondisi:

1. Output adalah dalam rangka nondecreasing (setiap elemen tidak lebih kecil dari elemen sebelumnya sesuai dengan total order yang diinginkan);2.
2. Output adalah permutasi, atau penataan ulang, dari input.

Sejak awal komputasi, masalah pengurutan telah menarik banyak penelitian, mungkin karena kompleksitas penyelesaian secara efisien meskipun sederhana pernyataannya, akrab. Sebagai contoh, bubble sort dianalisis sejak 1956 [1] Walaupun banyak yang menganggapnya masalah dipecahkan, berguna algoritma pengurutan baru masih ditemukan (misalnya, seperti perpustakaan pertama kali diterbitkan pada tahun 2004).. Sorting algoritma yang lazim di kelas pengantar ilmu komputer, di mana kelimpahan algoritma untuk masalah memberikan pengenalan lembut ke berbagai konsep algoritma inti, seperti membagi besar O, notasi dan menaklukkan algoritma, struktur data, algoritma acak, terbaik, terburuk dan analisis kasus rata-rata, pengorbanan waktu-ruang, dan batas bawah.

Klarifikasi

Sorting algoritma yang digunakan dalam ilmu komputer sering dikelompokkan berdasar:

 Kompleksitas Komputasi (perilaku terburuk, rata-rata dan terbaik) dari perbandingan unsur dalam hal ukuran daftar (n). Untuk algoritma pengurutan khas perilaku yang baik adalah O (n log n) dan perilaku buruk adalah O (n2) Ideal untuk semacam perilaku adalah O (n),namun hal ini tidak mungkin dalam kasus rata-rata. Perbandingan algoritma pengurutan berbasis, yang mengevaluasi elemen daftar melalui operasi perbandingan abstrak kunci, memerlukan setidaknya O (n log n) perbandingan untuk input yang paling.
 Komputasi kompleksitas swap (untuk "di tempat" algoritma).
 Memory penggunaan (dan penggunaan sumber daya komputer lain). Secara khusus, beberapa algoritma pengurutan adalah "di tempat". Ini berarti bahwa mereka hanya perlu O(1) atau O (log n) memori luar item yang disortir dan mereka tidak perlu membuat lokasi tambahan untuk data yang akan disimpan sementara, seperti di lain algoritma pengurutan.
 Rekursi. Beberapa algoritma yang baik rekursif atau non-rekursif, sementara yang lain mungkin baik (misalnya, menggabungkan sort).
 Stabilitas: algoritma pengurutan stabil menjaga urutan relatif dari record dengan kunci yang sama (yaitu, nilai-nilai). Lihat di bawah untuk informasi lebih lanjut.
 Apakah atau tidak mereka adalah semacam perbandingan. Semacam perbandingan memeriksa data hanya dengan membandingkan dua elemen dengan operator perbandingan.
 Metode Umum: penyisipan, pertukaran, seleksi, penggabungan, dll. jenis Efek termasuk bubble sort dan quickSort. Seleksi macam termasuk semacam shaker dan heapsort.
 Adaptasi: Apakah atau tidak presortedness input mempengaruhi waktu berjalan. Algoritma yang mempertimbangkan hal ini diketahui adaptif.

Stabilitas

algoritma pengurutan Stabil menjaga urutan relatif dari record dengan kunci yang sama. Jika semua tombol berbeda maka perbedaan ini tidak diperlukan. Tetapi jika ada kunci sama, maka algoritma sorting stabil jika setiap kali ada dua catatan (katakanlah R dan S) dengan tombol yang sama, dan R muncul sebelum S dalam daftar yang asli, maka R akan selalu muncul sebelum S di daftar diurutkan. Apabila terdapat unsur yang sama tidak dapat dibedakan, seperti dengan bilangan bulat, atau lebih umum, data dimana seluruh elemen kunci, stabilitas tidak menjadi masalah. Namun, menganggap bahwa pasangan berikut nomor harus diurutkan berdasarkan komponen pertama mereka:


(4, 2) (3, 7) (3, 1) (5, 6)


Dalam hal ini, dua hasil yang berbeda yang mungkin, salah satu yang menjaga urutan relatif dari record dengan kunci yang sama, dan satu yang tidak:


(3, 7) (3, 1) (4, 2) (5, 6) (Urutan dipertahankan)
(3, 1) (3, 7) (4, 2) (5, 6) (Urutan diubah)


algoritma sorting yang tidak stabil dapat mengubah urutan relatif dari record dengan kunci yang sama, tetapi algoritma pengurutan stabil tidak pernah melakukannya. algoritma pengurutan tidak stabil dapat diterapkan khusus menjadi stabil. Salah satu cara untuk melakukan ini adalah artifisial memperpanjang perbandingan kunci, sehingga perbandingan antara dua objek dengan tombol dinyatakan sama akan memutuskan menggunakan urutan entri dalam urutan data aslinya sebagai pemecah-dasi. Mengingat urutan ini, bagaimanapun, sering melibatkan biaya komputasi tambahan.

Sorting berdasarkan tersier, primer sekunder, dll kunci semacam dapat dilakukan oleh setiap metode pengurutan, mengambil semua kunci semacam ke account dalam perbandingan (dengan kata lain, menggunakan kunci semacam tunggal komposit). Jika metode pengurutan stabil, juga memungkinkan untuk menyortir beberapa kali, setiap kali dengan satu tombol sort. Dalam hal bahwa kunci perlu diterapkan dalam urutan prioritas meningkat.

Contoh: sorting pasangan nomor seperti di atas dengan terlebih dahulu, maka kedua komponen:

(4, 2) (3, 7) (3, 1) (5, 6) (asli)



(3, 1) (4, 2) (5, 6) (3, 7) (setelah menyortir menurut komponen kedua)
(3, 1) (3, 7) (4, 2) (5, 6) (setelah menyortir menurut komponen pertama)


Di sisi lain:

(3, 7) (3, 1) (4, 2) (5, 6) (setelah menyortir menurut komponen pertama)
(3, 1) (4, 2) (5, 6) (3, 7) (setelah menyortir menurut Komponen kedua,
urutan oleh komponen pertama adalah terganggu).




Macam-macam sort

1. Bubble Sort

Metode bubble sort merupakan metode tersederhana untuk melakukan pengurutan data , tetapi memiliki kinerja yang terburuk untuk data yang besar. Diberi nama “Bubble” karena proses pengurutan secara berangsur-angsur bergerak/berpindah ke posisinya yang tepat, seperti gelembung yang keluar dari sebuah gelas bersoda. Bubble Sort mengurutkan data dengan cara membandingkan elemen sekarang dengan elemen berikutnya.Penukaran baru dilakukan kalau suatu kriteria terpenuhi.

Pengurutan Ascending : Jika elemen sekarang lebih besar dari elemen berikutnya maka kedua elemen tersebut ditukar.Pengurutan Descending: Jika elemen sekarang lebih kecil dari elemen berikutnya, maka kedua elemen tersebut ditukar.Algoritma ini seolah-olah menggeser satu per satu elemen dari kanan ke kiri atau kiri ke kanan, tergantung jenis pengurutannya, asc atau desc.Ketika satu proses telah selesai, maka bubble sort akan mengulangi proses, demikian seterusnya sampai dengan iterasi sebanyak n-1.Bubble sort berhenti jika seluruh array telah diperiksa dan tidak ada pertukaran lagi yang bisa dilakukan, serta tercapai perurutan yang telah diinginkan.

Bubble Sort adalah salah satu metode pengurutan (sorting) dengan cara membandingkan angka dalam satu waktu yang ada pada list, kemudian memperbaiki urutan angka – angka tersebut jika tidak mengikuti urutan yang ditentukan.
contoh:
input (input.txt)
5 6 8 4 8 9
1 3 6 4 8 4
1 0 6 9 5 8

input memiliki 6 kolom k dan 3 baris j

1. Baca file input.txt dan store setiap value kedalam baris dan kolom yang sesuai, misal variable: angka[j][k]

2. Gunakan for loop 2-d array untuk membaca susunan angka

01 for(int j=0;j<3;j++){//baris
02 for(int k=0;k<6;k++){//kolom
03 //bubble sorting : angka akan diswap bila angka berikutnya lebih besar dari angka sebelum
04 if(angka[j][k] < angka[j][k+1]){
05 int temp = angka[j][k];
06 angka[j][k] = angka[j][k+1];
07 angka[j][k+1] = temp;
08 }
09 cout<
10 }
11 cout<
12 }

sekarang variable angka telah diurutkan. bisa langsung tulis ke dalam file output.txt
output (output.txt):
9 8 8 6 5 4
8 6 4 4 3 1
9 8 6 5 1 0

ilustrasi pengurutan dengan bubble sortnya akan terlihat seperti pada table dibawah ini :

LANGKAH 1 :
1 2 3 4 5 6 POSISI DATA
22 10 15 3 8 2 Data Awal
22 10 15 3 2 8 tukar data 5 dengan 6
22 10 15 2 3 8 tukar data 4 dengan 3
22 10 2 15 3 8 tukar data 3 dengan 2
22 2 10 15 3 8 tukar data 2 dengan 1
2 22 10 15 3 8 LANGKAH 1 SELESAI

LANGKAH 2 :
1 2 3 4 5 6 POSISI DATA
2 22 10 15 3 8 Data Langkah 1 Akhir
2 22 10 3 15 8 tukar data 4 dengan 3
2 22 3 10 15 8 tukar data 3 dengan 2
2 3 22 10 15 8 LANGKAH 2 SELESAI

LANGKAH 3 :
1 2 3 4 5 6 POSISI DATA
2 3 22 10 15 8 Data Langkah 2 Akhir
2 3 22 10 8 15 tukar data 5 dengan 6
2 3 22 8 10 15 tukar data 4 dengan 3
2 3 8 22 10 15 LANGKAH 3 SELESAI

LANGKAH 4 :
1 2 3 4 5 6 POSISI DATA
2 3 8 22 10 15 Data Langkah 3 Akhir
2 3 8 22 10 15 tukar data 5 dengan 4
2 3 8 10 22 15 LANGKAH 4 SELESAI

LANGKAH 5 :
1 2 3 4 5 6 POSISI DATA
2 3 8 10 22 15 Tukar data 5 dengan 6
2 3 8 10 15 22 TERURUT



2.Exchange Sort

Metode Exchange Sort merupakan metode pengurutan data yang sangat mirip dengan Bubble Sort bahkan banyak yang mengatakan Bubble Sort sama dengan Exchange Sort. Namun perbedaan antara Exchange Sort dan bubble sort terletak dalam hal bagaimana membandingkan antar elemen-elemennya. Exchange sort membandingkan suatu elemen dengan elemen-elemen lainnya dalam array tersebut, dan melakukan pertukaran elemen jika perlu. Jadi ada elemen yang selalu menjadi elemen pusat (pivot).

Sedangkan Bubble sort akan membandingkan elemen pertama/terakhir dengan elemen sebelumnya/sesudahnya, kemudian elemen tersebut itu akan menjadi pusat (pivot) untuk dibandingkan dengan elemen sebelumnya/sesudahnya lagi, begitu seterusnya.

ilustrasi pengurutan dengan Exchange sortnya akan terlihat seperti pada table dibawah ini :










• Prosedur Exchange Sort


3.Selection Sort

Metode selection sort merupakan metode pengurutan data kombinasi antara sorting dan searching. Mekanismenya seperti berikut ini : Mula – mula suatu petunjuk (diberi nama posAwal ) yang menunjuk lokasi awal pengurutan data diatur agar berisi indeks pertama dalam larik. Selanjutnya dicari bilangan terkecil yang terletak antara posisi sesudah yang ditunjuk oleh penunjuk tersebut element yang terakhir dalam larik. Lokasi bilangan ini di tunjuk oleh posMin. Lalu tukarkan nilai bilangan terkecil tersebut dengan nilai yang di tunjukkan posAwal. Proses seperti ini di ulang dari posAwal berniali 0 hingga n-2 , dengan n menyatakan jumlah element larik.

ilustrasi pengurutan dengan Selection sortnya akan terlihat seperti pada table dibawah ini :






4.Insertion Sort

Metode Insertion sort merupakan metode pengurutan data yang mirip dengan cara orang mengurutkan kartu, selembar demi selembar kartu diambil dan disisipkan (insert) ke tempat yang seharusnya sehinggan penambahan kartu tersebut akan membuat semua kartu tetap terurutkan. Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan data yang lebih kecil, maka akan ditempatkan (diinsert) diposisi yang seharusnya.Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang.

ilustrasi pengurutan dengan Insertion sortnya akan terlihat seperti pada table dibawah ini :









5.Quick Sort

Metode Quick sort merupakan metode pengurutan data yang di kemukakan pertama kali oleh C. AR Hoare pada tahun 1962. Metode ini menggunakan strategi “pecah-belah” dengan mekanisme seperti berikut : Larik L[p..r] dengan indeks terkecil adalah p dan indeks terbesar adalah r disusun ulang (dipartisi) menjadi dua buah larik A[p..p] dan A[q+1…r] sehingga setiap elemen dalam A[p..q] selalu bernilai lebih kecil daripada A[q+1…r]. Selanjutnya kedua larik tersebut di urut secara rekursif. Dengan sendirinya kombinasi kedua larik tersebut membentuk larik dengan data yang telah di urut.

Membandingkan suatu elemen (disebut pivot) dengan elemen yang lain dan menyusunnya sedemikian rupa sehingga elemen- elemen lain yang lebih kecil daripada pivot tersebut terletak di sebelah kirinya dan elemen-elemen lain yang lebih besar daripada pivot tersebut terletak di sebelah kanannya. Sehingga dengan demikian telah terbntuk dua sublist, yang terletak di sebelah kiri dan kanan dari pivot. Lalu pada sublist kiri dan sublist kanan kita anggap sebuah list baru dan kita kerjakan proses yang sama seperti sebelumnya. Demikian seterusnya sampai tidak terdapat sublist lagi. Sehingga didalamnya telah terjadi proses Rekursif.


6.Merge Sort

Merge sort merupakan salah satu teknik sorting yang mengurutkan suatu data dengan cara penggabungan.Merge sort juga menggunakan proses divide and conquer pada rekursi.Berikut adalah langkah kerja merge sort :
1. Devide
Memilah elemen – elemen dari data menjadi dua bagian.
2. Conquer
Menyelesaikan setiap bagian dengan memanggil prosedur merge sort secara rekursif.
3. Kombinasi
Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan rangkaian data berurutan.

Proses rekursi akan berhenti jika telah mencapai elemen dasar, atau artinya jika bagian yang diurutkan menyisakan tepat satu elemen. Sisa pengurutan satu elemen tersebut menandakan bahwa bagian tersebut telah sesuai rangkaian. Sebagai catatan, pengkombinasian dilakukan dengan cara pembandingan. Elemen yang nilainya lebih kecil akan masuk ke kotak terlebih dahulu dan mengisi bagian disebelah kiri terlebih dahulu.Pada merge sort, data yang akan digabungkan berada pada suatu array, sebutlah array x dan array yang digunakan untuk menampung hasil gabung adalah array yang berbeda dari array x tersebut, sebutlah array y. Penyalinan elemen data dari array x ke array y ditentukan oleh hasil perbandingan data kelompok pertama x(i) dan data kelompok setelahnya x(j). Apabila nilai x(i) lebih kecil dibanding x(j) maka x(i) disalin ke y(k) kemudian indeks I dan k masing – masing ditambah satu. Proses ini akan berulang sampai seluruh data habis diproses.


7.Shell Sort

Ditemukan oleh Donal Shell pada tahun 1959. Merupakan algoritma paling efisien dari kelas sorting O(n2). Algoritma ini memiliki kesamaan cara kerja dengan insertion sort, yaitu membandingkan elemen-elemen dengan jarak tertentu. Insertion sort membandingkan elemen – elemen data yang berdekatan (berjarak satu posisi), sedangkan shell sort membandingkan elemen berjarak tertentu, misalnya elemen yang berjarak 5 posisi atau 2 posisi dan pada akhirnya akan selesai pada pengurutan data yang berjarak 1 posisi. Namun nilai ini haruslah dicari sedemikian rupa agar tidak mengulangi atau merusak hasil sorting sebelumnya. Adapula nilai – nilai jarak yang dianjurkan adalah sebagai berikut :
1. Shell’s increment
1, 2, 4, 8
2. Hibbard’s increment
1, 3, 7, 15, …, 2k – 1
3. Sedgewick’s increment
1, 5, 19, 41, 109

Pada proses sorting, jarak yang diambil dilakukan secara menurun, sedangkan proses sorting elemennya dilakukan seperti insertion. Pada pengurutan elemen – elemen jarak lima, pengurutan dilakukan terhadap data ke-9, ke-4, ke-8, ke-3, dan seterusnya. Dimana jumlah data yang terlibat dalam suatu rangkaian pengurutan tidak selalu dua tetapi tergantung pada banyak data. Andaikan jumlah data adalah 11 maka pada rangkaian pengurutan pertama dilakukan pengurutan terhadap data ke-10, ke-5, dank e-0.

Contoh :
Rangkaian data :
1 2 3 4 5 6 7 8 9 10
2 5 1 3 9 7 8 0 5 4

Kenaikan : 5

Maka data yang pertama dibandingkan adalah data ke-6 dengan ke-1 kemudian ke-7 dengan ke-2 , ke-8 dengan ke-3, ke-9 dengan ke-4, ke-10 dengan ke-5. Dan hasilnya adalah :
1 2 3 4 5 6 7 8 9 10
2 5 0 3 4 7 8 5 5 9

Kenaikan : 2

Maka data yang selanjutnya dibandingkan adalah data ke-3 dengan ke-1, ke-4 dengan ke-2, ke-5 dengan ke-3, ke-6 dengan ke-4, ke-7 dengan ke-5, ke-8 dengan ke-6, ke-9 dengan ke-7,dan ke-10 dengan ke-8. Dan hasilnya adalah sebagai berikut :
1 2 3 4 5 6 7 8 9 10
0 3 2 5 4 5 5 7 8 9

Kenaikan : 1

Maka data yang akan diurutkan adalah data ke-2 dengan ke-1, ke-3 dengan ke-2, ke-4 dengan ke-3, dan seterusnya sampai data ke-10 dengan ke-9. Dan hasilnya adalah sebagai berikut :
1 2 3 4 5 6 7 8 9 10
0 2 3 4 5 5 5 7 8 9

Dalam proses pengurutannya shell sort dapat lima kali lebih cepat bila dibandingkan dengan bubble sort dan kurang lebih dua kali lebih cepat bila dibandingkan dengan insertion sort. Namun, jika dibandingkan dengan merge, heap, ataupun quicksort, shellsort masih tergolong lebih lambat. Tetapi algoritma sorting yang begitu sderhana membuat shellsort merupakan pilihan yang cocok untuk melakukan sorting pada data kurang dari 5000 item atau data dengan ukuran tidak terlalu besar.

Senin, 27 Desember 2010

STACK (TUMPUKAN)


1.      DEFINISI STACK

Stack merupakan suatu kumpulan data yang seolah-olah ada data yang diletakkan di atas data yang lain. Dimana kita dapat menambah (menyisip) data, dan mengambil (menghapus) data lewat ujung yang sama, yang disebut sebagai ujung atas tumpukan (top of stack).


Stack bersifat LIFO (Last In First Out), yang berarti data yang terakhir masuk ke dalam stack akan menjadi data pertama yang dikeluarkan dari stack. Secara sederhana sebuah stack dapat kita ilustrasikan seperti gambar dibawah ini. Kita bisa mengatakan bahwa kotak B ada diatas kotak  A dan ada dibawah kota C. Dari  gambar tersebut kita dapat melihat bahwa kita hanya bisa menambah atau mengambil sebuah kota lewat satu ujung. Yaitu ujung bagian atas. Nampak pula bahwa stack merupakan kumpulan data yang sifatnya dinamis. Artinya kita bisa menambah atau mengambil dari dirinya. 
Top
Contoh  gambar




2.      OPERASI ATAU FUNGSI STACK

Ada enam jenis operasi atau fungsi pada stack, yaitu:
a. Create, digunakan untuk membuat stack baru.
b. Push, digunakan untuk menambahkan elemen pada urutan terakhir.
c. Pop, digunakan untuk mengambil elemen stack pada tumpukan paling atas.
d. Clear, digunakan untuk mengosongkan stack.
e. Print, digunakan untuk menampilkan semua elemen-elemen stack.
f. IsEmpety, digunakan untuk mengecek apakah stack dalam keadaan kosong.
g. IsFull, digunakan untuk memeriksa apakah stack sudah penuh.

3.      PENDEKLARASIAN STACK

Proses pendeklarasian stack adalah proses pembuatan struktur stack dalam memori. Karena stack dapat direpresentasikan menggunakan array maka suatu stack memiliki beberapa bagian yaitu:
a. Top yang menunjuk posisi data terakhir.
b. Elemen yang berisi data yang ada dalam stack. Bagian inilah yang berbentuk array.
c. Maks_elemen yaitu variabel yang menunjuk maksimal banyaknya elemen dalam stack.

4.      INISIALISASI STACK

Inisialisasi stack adalah proses pembuatan suatu stack kosong. Adapun langkah-langkah proses inisialisasi stack yang menggunakan array adalah:
1. dengan mengisi nilai field top dengan 0 (nol) jika elemen pertama diawali dengan nomor 1. Kalau elemen pertama array dimulai dengan 0, maka top diisi dengan nilai -1.
2. Top adalah suatu variabel penanda dalam stack yang menunjukkan elemen teratas stack sekarang. Top of Stack akan selalu bergerak hingga mencapai Max of Stack sehingga menyebabkan stack penuh.

5.      OPERASI-OPERASI STACK SECARA LENGKAP
a. Operasi Push
Operasi push adalah operasi dasar dari stack. Operasi ini berguna untuk menambah suatu elemen data baru pada stack dan disimpan pada posisi top yang akan mengakibatkan posisi top akan berubah. Langkah operasi ini adalah:
Ø Periksa apakah stack penuh (isfull). Jika bernilai false/0 (tidak penuh) maka proses push dilaksanakan dan jika pemeriksaan ini bernilai true/1 (stack penuh), maka proses push digagalkan.
Ø Proses push-nya sendiri adalah dengan menambah field top dengan 1, kemudian elemen pada posisi top diisi dengan elemen data baru.
b. Operasi Pop
Operasi pop adalah salah satu operasi paling dasar dari stack. Operasi ini berguna untuk mengambil elemen terakhir (top) dan kemudian menghapus elemen tersebut sehingga posisi top akan berpindah. Operasi ini biasanya dibuat dalam bentuk function yang me-return-kan nilai sesuai data yang ada di top.
Langkah operasi pop pada stack yang menggunakan array adalah terlebih dahulu memeriksa apakah stack sedang keadaan kosong, jika tidak kosong maka data diambil pada posisi yang ditunjuk oleh posisi top, kemudian simpan dalam variable baru dengan nama data, kemudian posisi top -1, kemudian nilai pada variable data di-return-kan ke function.

c. Operasi Isempty
Operasi ini digunakan untuk memeriksa apakah stack dalam keadaan kosong. Operasi ini penting dilakukan dalam proses pop. Ketika suatu stack dalam keadaan kosong, maka proses pop tidak bisa dilakukan.
Operasi ini dilakukan hanya dengan memeriksa field top. Jika top bernilai 0 (untuk elemen yang dimulai dengan index 1) atau top bernilai -1 (untuk elemen yang dimulai dengan index 0), maka berarti stack dalam keadaan empty (kosong) yang akan me-return-kan true (1) dan jika tidak berarti stack mempunyai isi dan me-return-kan nilai false (0).

d. Operasi Isfull
Operasi ini berguna untuk memeriksa keadaan stack apakah sudah penuh atau belum. Operasi ini akan menghasilkan nilai true (1) jika stack telah penuh dan akan menghasilkan nilai false (0) jika stack masih bisa ditambah.
Operasi ini akan memberikan nilai true (1) jika field top sama dengan field maks_elemen (untuk array yang elemennya dimulai dari posisi 1) atau top sama dengan maks_elemen-1 (unauk array yang elemennya dimulai dari posisi 0).
e. Aplikasi Stack

Suatu perhitungan aritmatika biasanya berhubungan dengan operand dan operator. Operand merupakan suatu karakter atau elemen yang nilainya dioperasikan dengan bantuan suatu operator untuik menghasilkan suatu solusi.
Misalkan jika diberikan suatu ekspresi aritmatika 2*3, maka elemen ‘dua’ dan elemen ‘tiga’ merupakan operand dari ekspresi tersebut dan elemen ‘*’ merupakan operator perkalian atas dua operand yang menghasilkan suatu solusi. Suatu ekspresi aritmatika dapat dibedakan dalam tiga bentuk notasi perhitungan yaitu :
1) Notasi prefix, jika operator ditempatkan sebelum dua operand
2) Notasi infix, jika operator ditempatkan diantara dua operand
3) Notasi postfix, jika operator ditempatkan setelah dua operand
Dalam penggunaannya di kehidupan sehari-hari, notasi infix merupakan notasi aritmatika yang paling banyak digunakan untuk mengekspresikan suatu perhitungan artimatik dibanding dengan dua notasi yang lain, akan tetapi notasi postfix merupakan notasi yang digunakan oleh mesin kompilasi pada komputer dengan maksud untuk mempermudah proses pengkodean, sehingga mesin kompilasi membutuhkan stack untuk proses translasi ekspresi tersebut.
Berdasarkan teori yang diterangkan tersebut di atas, proses konversi infix menjadi notasi postfix dalam implementasinya membutuhkan stack pada proses konversinya, adapun proses tersebut memiliki 4 (empat) aturan yang digunakan, yaitu :
1) Jika ditemukan simbol kurung buka “(“, maka operasi push pada stack akan digunakan untuk menyimpan simbol tersebut ke dalam stack.
2) Jika ditemukan simbol kurung buka “)”, operasi pop digunakan untuk mengeluarkan operator-operator yang berada di dalam stack.

3) Jika terdapat simbol operator, maka operasi yang dilakukan pada stack terbagi atas:
a. Jika TOP(S) dari stack tersebut kosong atau berisi simbol “(“ maka operasi push akan digunakan untuk memasukan operator tersebut pada posisi di TOP(S).
b. Jika operator yang berada dipuncak stack merupakan elemen yang memiliki tingkat yang sama atau lebih tinggi maka operasi pop digunakan untuk mengeluarkan operator tersebut diikuti operasi push untuk menyimpan operator hasil scanning untai.
c. Jika operator yang berada di puncak stack memiliki tingkat yang lebih rendah dari operator yang discan, maka operator baru akan langsung dimasukan ke dalam stack dengan operasi push.
Adapun tingkatan operator yang dilacak menurut urutan tingkat adalah:
Tabel 1. Level Operator dalam Stack
Operator Level Operator
** Tinggi
* atau / Menengah
+ atau - Rendah


1. Notasi Prefix
Seorang ahli matematika “Jan Lukasiewicz“ mengembangkan satu cara penulisan ungkapan numeris yang selanjutnya disebut “Notasi Polish“ atau “Notasi Prefix” yang artinya: operator ditulis sebelum kedua operand yang akan disajikan.
Contoh notasi prefix dari notasi infix:
Infix Prefix
A + B + A B
A + B – C - + A B C
( A + B ) * ( C – D ) * + A B – C D
A – B / ( C * D $ E ) - - -

Secara sederhana, proses konversi dari infix menjadi prefix sebagai berikut:
1. Ungkapan yang akan dikonversikan adalah ( A + B ) * ( C – D ).
2. Dengan menggunakan tanda kurung bantuan, ungkapan diatas kita ubah menjadi: [ + A B ] * [ - C D ]

3. Jika [ + A B ] kita misalkan P, dan [ - C D ] kita misalkan Q maka ungkapan di atas bisa ditulis sebagai berikut: P * Q
4. Selanjutnya notasi infix dirubah menjadi prefix: * P Q
5. Dengan mengembalikan P dan Q pada notasinya semula dan menghapus tanda kurung bantuan, kita peroleh notasi prefix dari persamaan ( A + B ) * ( C – D ) yaitu: * + A B – C D
Contoh:
1. A + B * C
B * C = * B C ..... P
C * P = * C P ..... Q
Algoritma Infix Ke Prefix:
Langkah 0:- Baca ungkapan dalam notasi infix, misalnya S;
- Tentukan panjang ungkapan tersebut, misalnya N;
- Siapkan sebuah tumpukan kosong dan siapkan derajat masing-masing operator. Misalnya: $ berderajat 3, * dan / berderajat 2, + dan – berderajat 1 dan (berderajat 0).
Langkah 1:
Dimulai dari I : N sampai 1, kerjakan langkah-langkah berikut :
a. R = S ( I )
b. Test nilai R. Jika R adalah:
- Operand : Langsung ditulis
- Kurung buka : Pop dan tulis semua isi tumpukan sampai ujung tumpukan = ‘)‘, pop juga tanda ini tetapi tidak perlu ditulis.
- Kurung tutup : Push kedalam tumpukan
- Operator : Jika tumpukan kosong, atau derajat R lebih tinggi
dibanding derajat ujung tumpukan, push operator
ke dalam tumpukan. Jika tidak pop ujung tumpukan dan tulis, kemudian ulangi perbandingan R dengan ujung tumpukan, lalu R di push.
Catatan: Kurung tutup di dalam tumpukan dianggap mempunyai derajat yang lebih rendah dibanding R.
Langkah 2: Jika akhir notasi infix telah tercapai dan tumpukan masih belum kosong, pop semua isi tumpukan dan tulis hasilnya.


Contoh:
1. A + B * C
Proses Ke- Karakter Dibaca Isi Stack Karakter Tercetak Notasi Prefix Terbentuk
1. C C C
2. * *
3. B * B BC
4. + + * *BC
5. A + A A*BC
6. + +A*BC

2. Notasi Infix
Salah satu pemanfaatan tumpukan adalah untuk menulis ungkapan menggunakan notasi tertentu. Dalam penulisan ungkapan khususnya ungkapan numeris, kita selalu menggunakan tanda kurung untuk mengelompokkan bagian mana yang harus dikerjakan lebih dahulu.
Contoh :
1. ( A + B ) * ( C – D )
Suku ( A + B ) akan dikerjakan lebih dahulu, kemudian suku ( C – D ) dan terakhir mengalikan hasil yang diperoleh dari 2 suku ini.
2. A + B * C – D
Maka B * C akan dikerjakan lebih dahulu diikuti yang lain.
Dalam hal ini pemakaian tanda kurung akan sangat mempengaruhi hasil akhir. Cara penulisan ungkapan sering disebut dengan “Notasi Infix” artinya operator ditulis diantara 2 operand.
3. Notasi Postfix
Notasi lain yang merupakan kebalikan notasi prefix adalah “Notasi Postfix” atau lebih dikenal dengan Notasi Polish Terbalik (Reverse Polish Notation atau RPN). Dalam hal ini operator ditulis sesudah operand. Sama halnya dengan notasi prefix disini juga diperlukan tanda kurung pengelompokan.
Proses notasi dari infix ke postfix adalah :
1. Ungkapan yang akan dikonversikan adalah: (A + B ) * ( C – D ).
2. Dengan menggunakan tanda kurung bantuan, ungkapan diatas diubah menjadi: [ A B + ] * [ C D - ]
3. Jika [ A B + ] kita misalkan P, dan [ C D - ] kita misalkan Q, maka ungkapan diatas dapat ditulis: P * Q
4. Selanjutnya notasi infix dirubah menjadi postfix yaitu: P Q *
5. Dengan mengembalikan P dan Q paada notasinya semula dan menghapus tanda kurung bantuan kita peroleh notasi postfix dari persamaan:
( A + B ) * ( C - D ) yaitu A B + C D - *
Contoh notasi infix ke postfix:
Infix Postfix
A + B – C A B + C –
( A + B ) * ( C – D ) A B + C D - *
A – B / ( C * D $ E ) - - -

Contoh soal:
1. A – B / ( C * D $ E )
D $ E = D E $ .... P
C * P = C P * .... Q
B / Q = B Q / .... R
A – R = A R –
= A B Q / -
= A B C P * / -
= A B C D E $ * / -


Algoritma Infix Ke Postfix:
Langkah 0:- Baca ungkapan dalam notasi infix, misalnya S;
- Tentukan panjang ungkapan tersebut, misalnya N;
- Siapkan sebuah tumpukan kosong dan siapkan derajat masing-masing operator. Misalnya: $ berderajat 3, * dan / berderajat 2, + dan – berderajat 1 dan (berderajat 0).
Langkah 1:
Dimulai dari I : 1 sampai N, kerjakan langkah-langkah berikut:
a. R = S ( I )
b. Test nilai R . Jika R adalah:
- Operand : Langsung ditulis
- Kurung buka : Push kedalam tumpukan
- Kurung tutup : Pop dan tulis semua isi tumpukan sampai ‘(‘, pop juga tanda ini tetapi tidak perlu ditulis
- Operator : Jika tumpukan kosong, atau derajat R lebih tinggi
dibanding derajat ujung tumpukan, push operator ke dalam tumpukan. Jika tidak pop ujung tumpukan dan tulis, kemudian ulangi perbandingan R dengan ujung tumpukan, lalu R di push.
Catatan: Kurung buka di dalam tumpukan dianggap mempunyai derajat yang lebih rendah dibanding R.
Langkah 2: Jika akhir notasi infix telah tercapai dan tumpukan masih belum kosong, pop semua isi tumpukan dan tulis hasilnya.
Contoh:
1. A + B * C
Proses ke- Karakter Dibaca Isi Stack Karakter Tercetak Notasi Postfix Terbentuk
1. A A A
2. + +
3. B + B AB
4. * *+
5. C *+ C ABC
6. + * ABC*
7. + ABC*+