Senin, 08 Juni 2015

Stack ( Tumpukan ) dan Contohnya

Nama  : Agung Wijaya Kusuma
NIM     : 140010222
Kelas   : AB141
Nama Dosen : Ida Bagus Kadek Surya Arnawa. S.Kom
Nama Asisten Dosen : Steven Anthony

     C.   Stack
Stack merupakan bentuk khusus dari suatu struktur data, dimana node yang ditambahkan kedalam list dan diambil dari list hanya pada prinsip pengolahannya adalah last-in first-out 
( LIFO ). Dengan demikian, hanya ada dua fungsi utama, yaitu push ( memasukkan node kedalam stack ), dan pop ( mengambil node dari stack ).

Secara sederhana Stack atau Tumpukan bisa diartikan sebagai kumpulan data yang seolah-olah diletakkan di atas data yang lain. Kita Bisa menambah (menyisipkan) data dan mengambil (menghapus) data melalui ujung yang sama yang disebut sebagai ujung atas tumpukan.
Contohnya misalkan kita mempunyai 2 buah kotak yang ditumpuk sehingga kotak yang satu akan diatas kotak yang lainnya. Jika kemudian tumpukan 2 kotak tadi, ditambah kotak ketiga, keempat, kelima dan seterusnya, maka akan diperoleh sebuah tumpukan kotak yang terdiri dari N kotak.

Contoh sederhana dari Stack ( Tumpukan ) bisa digambarkan sebagai berikut :


6

5

4

3

2

1
·         

Dari gambar diatas bisa di lihat bahwa kotak 2 terletak di atas kotak 1 dan di bawah kotak 3. Gambar diatas menunjukan bahwa dalam tumpukan dalam tumpukan hanya bisa menambah atau mengambil sebuah kotak lewat satu ujung yaitu bagian atas. Bisa dilihat juga yang menjadi ujung atas tumpukan adalah kotak 6. Jadi jika ada kotak lain yang akan di sisipkan, akan diletakkan di atas kotak 6, dan jika ada kotak yang akan diambil, maka kotak 6 yang akan pertama diambil. 


Operasi pada Stack
Ada 2 operasi dasar yang bisa dilaksanakan pada sebuah tumpukan, yaitu operasi menyisipkan data ( push ) dan operasi menghapus data ( pop ).

1. Operasi Push
Perintah push digunakan untuk memasukkan data kedalam tumpukan. Misalkan kita mempuyai data-data 2, 24, dan 32 dalam tumpukan dengan posisi 2 paling bawah dan 32 paling atas. Dan kita akan memasukkan data 45 ke dalam tumpukan tersebut. Tentu saja data 45 akan diletakkan di atas data 32.

Prosesnya dari operasi push dapat dilihat pada penggalan program berikut ini :
void Push(NOD **T, char item)
{
            NOD *n;
            n = NodBaru(item);
            n-> next = *T
*T = n;
} 


2. Operasi Pop
Operasi pop adalah operasi untuk menghapus elemen yang terletak pada posisi paling atas dari sebuah tumpukan.
Prosesnya dari operasi pop dapat dilihat pada penggalan program berikut ini :
Char Pop(NOD **T)
{
            NOD *P; char item;
            If( ! TumpukanKosong(*T)
{
            P =*T;
            *T = (*T)->next;
item = P->data;
free(P)
}
            return item;
}
Jika tumpukan kosong, Cara untuk melihat kosong tidaknya suatu tumpukan adalah dengan membuat suatu fungsi yang menghasilkan suatu data yang bertipe Boolean. Cara ini lebih disarankan karena dengan mengetahui nilai fungsi tersebut kita bisa tahu kosong tidaknya suatu tumpukan.

Fungsi untuk mengetahui kosong tidaknya suatu tumpukan dapat dilihat pada program berikut ini :
//Uji Tumpukan Kosong
BOOL TumpukanKosong(NOD *T)
{
            return ((BOOL) (T == NULL));
}

Contoh stack dalam coding :
#include <iostream.h>
#include <conio.h>
#include <stdio.h>


struct STACK
{
            int data[5];
   int atas;
};

STACK tumpuk;

void main()
{
            clrscr();
   int pilihan,baru,i;
   tumpuk.atas=-1;
   do
   {
            clrscr();
      cout<<"1.Push Data"<<endl;
      cout<<"2.Pop Data"<<endl;
      cout<<"3.Print Data"<<endl;
      cout<<endl;
      cout<<"Pilihan : ";
      cin>>pilihan;
      switch(pilihan)
      {
            case 1 :
         {
            if(tumpuk.atas==5-1)
            {
                        cout<<"Tumpukan penuh";
               getch();
            }
            else
            {
                        cout<<"Data yang akan di Push :";
               cin>>baru;
               tumpuk.atas++;
               tumpuk.data[tumpuk.atas]=baru;
            }
            break;
         }
         case 2 :
         {
            if(tumpuk.atas==-1)
            {
                        cout<<"Tumpuk kosong";
               getch();
            }
            else
            {
                        cout<<"Data yang akan di Pop ="<<tumpuk.data[tumpuk.atas]<<endl;
               tumpuk.atas--;
               getch();
            }
            break;
         }
         case 3 :
         {
            if (tumpuk.atas==-1)
            {
                        cout<<"Tumpukan kosong "<<endl;
                        getch;
            }
         else
            {
                        cout<<"Data= " <<endl;
                        for(i=0;i<=tumpuk.atas;i++)
                        {
                                    cout<<tumpuk.data[i]<<" ";
                        }
            getch();
         }
         break;
      }
      default:
      {
            cout<<"Tidak ada dalam pilihan"<<endl;
      }
   }
}
            while(pilihan>=1 && pilihan<=3);
            getch();
}
Sumber           : Buku Konsep dan Implementasi Struktur Data dengan C++
Oleh                : Lamhot Sitorus dan David J.M Sembiring, Andi Kristanto, S.Kom
Penerbit           : Andi dan Graha Ilmu

Jumat, 05 Juni 2015

Searching ( Sequential search dan Binary search ) beserta Contohnya

Nama  : Agung Wijaya Kusuma
NIM     : 140010222
Kelas   : AB141
Nama Dosen : Ida Bagus Kadek Surya Arnawa. S.Kom
Nama Asisten Dosen : Steven Anthony

     F.    Searching
Pencarian (Searching) merupakan tindakan untuk mendapatkan suatu data dalam kumpulan data berdasarkan satu kunci (key) atau acuan data dan pencarian data dengan cara menelusuri data-data tersebut. Tempat pencarian data dapat berupa array pada external memori, dan bisa juga di dalam internal memori. .
Pada umumya dikenal tiga metode Searching , antara lain : Sequential Search, Binary Search,  dan Interpolation Search. Tetapi saya akan menjelasakan tentang Sequential Search dan Binary Search saja.

     1.    Sequential Search
Sequential Search (pencarian beruntun) adalah proses membandingkan setiap elemen array satu per satu secara beruntun yang dimulai dari elemen pertama hingga elemen yang dicari ditemukan atau hingga elemen terakhir dari array.

Contoh : Diberikan satu array nilai dengan banyak elemen 8 seperti berikut :



10

13

9

3

25

65

13

30
       1               2                3               4              5             6               7              8

Misalkan nilai yang dicari adalah: X = 13

Kalau yang diharapkan hanya menyatakan ada atau tidak maka pemeriksaan di lakukan terhadap 10 dan 13 maka tampil pesan "13 ditemukan".


Kalau yang diharapkan adalah menampilkan seluruh data yang sama dan posisinya maka pemeriksaan dilakukan terhadap seluruh data 10, 13, 9, 3, 25, 65, 25, 13, dan 30. Pada saat pemeriksaan di lakukan dan ternyata sama maka posisi data yang sama tersebut akan di simpan dalam variabel juga (tipe array) dan hitung banyaknya data yang sama. Sehingga akan tampil pesan "13 ditemukan sebanyak 2 yaitu pada posisi 2 dan 7". 

Contoh Sorting Sequensial Search pada koding pemrograman:
/* Program Sequential Search */
#include <iostream.h>
#include <conio.h>
main()
{
            int Nilai[20];
            int i, N, Bilangan;
            bool ketemu;

cout<<”Masukkan Banyaknya Bilangan  : “;
cin>>N;
//Membaca elemen Array
for(i=0;i<N;i++)
{
            cout<<”Masukkan elemen ke-“<<i<<” :  “;
            cin>>Nilai[i];
}
//Mencetak elemen Array
cout<<endl;
cout<<”Deretan Bilangan : “;
for(i=0;i<N;i++)
cout<<Nilai[i]<<” “;
cout<<endl;
cout<<”Masukkan Bilangan yang akan Dicari : “;
cin>>Bilangan;
//melakukan pencarian
i=0;
do
{
            if(Nilai[i]==Bilangan)
            ketemu  = true;
            i++;
}
while( ! (ketemu));
if(ketemu)
cout<<”Bilangan “<<Bilangan<<” ditemukan “;
else
cout<<”Bilangan “<<Bilangan<<”tidak ditemukan”;
getch();
} 

Jika di compile dari coding Searching Sequential Search, maka akan tampak seperti gambar di bawah ini:





  
     2.    Binary Search
Binary Search adalah metode pencarian suatu data atau elemen didalam suatu array dengan kondisi data dalam keadaan terurut. Proses pencarian binary search hanya dapat dilakukan pada kumpulan data yang sudah diurutkan terlebih dahulu 
( menaik atau menurun ). Prinsip dari binary search terhadap N elemen dapat dijelaskan sebagai berikut :
a.    Tentukan posisi awal = 0 dan posisi akhir = N-1
b.    Hitung posisi tengah = (posisi awal + posisi akhir)/2.
c.    Bandingkan data yang dicari dengan elemen posisi tengah.
·         Jka sama maka catat posisi dan cetak kemudian berhenti
·         Jika lebih besar maka akan dilakukan pencarian kembali ke bagian kanan dengan posisi awal = posisi tengah +1 dan posisi akhir tetap kemudian ulangi mulai poin 2.
·         Jika lebih kecil maka akan dilakukan pencarian kembali ke bagian kiri dengan nilai posisi awal tetap dan nilai posisi akhir = posisi tengah -1 kemudian ulangi mulai poin 2

Contoh : Misalnya kita mempunyai deretan data dalam array nilai sebanyak 10 elemen dan akan dilakukan pencarian data 87 terhadap array. 

Nilai[0..9] = 12,45,23,87,90,55,15,25,40,21

Urutkan elemen array secara menaik, sehingga diperoleh:
Nilai[0..9] = 12,15,21,23,25,40,45,55,87,90

Data yang akan dicari = 87(bilangan)

Tentukan nilai awal = 0, akhir = N-1=9

Hitung tengah = (9+0)/2=4

Bandingkan Bilangan < Nilai[tengah]->87=25->false

Bandingkan Bilangan < Nilai[tengah]->87<25->false

Bandingkan Bilangan < Nilai[tengah]->87>25->true maka pencarian dilakukan ke sebelah kanan dengan nilai awal = tengah+1 = 5

Karena awal masih lebih kecil dari akhir maka ulangi kembali mulai menghitung tengah

Hitung tengah = (9+5)/2=7

Bandingkan Bilangan  < Nilai[tengah] ->87=55->false

Bandingkan Bilangan < Nilai[Tengah]->87<55->false

Bandingkan Bilangan < Nilai[tengah]->87>55->true maka pencarian dilakukan ke sebelah kanan dengan nilai awal = tengah+1 = 8

Karena awal masih lebih kecil dari akhir maka ulangi kembali mulai menghitung tengah

Hitung tengah = (9+8)/2 = 8

Bandingkan Bilangan < Nilai[tengah]->87=87->true


Karena sudah ditentukan hasil yang kita cari maka proses pencarian berhenti.

Contoh Searching Binary Search pada koding pemrograman:
 :
/* Program pencarian dengan Binary Search*/
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <iomanip.h>
void main()
{
            //deklarasi variabel
            int Nilai[20];
            int i, j, N;
            int temp, awal, akhir, tengah, Bilangan;
//proses penginputan data
cout<<”Banyak Bilangan : “;
cin>>N;
for(i=0;i<N;i++)
            {
                        cout<<”Elemen ke-“<<i<<”  =  “;
                        cin>>Nilai[i];
}
cout<<endl;
cout<<”Elemen sebelum diurut = “;
for(i=0; i<N; i++)
{
cout<<setw(3)<<Nilai[i];
}
//proses pengurutan data
for(i=0;i<N-1;i++)
{
                        for(j=i+1;j<N;j++)
{
                                    if (Nilai[i] > Nilai[j])
{
                                                temp = Nilai[i];
                                                Nilai[i]=Nilai[j];
                                                Nilai[j] = temp;
}          
}          
}
cout<<endl;
cout<<”Elemen seteleh diurut = “;
for(i=0;i<N;i++)
{
cout<<setw(3)<<Nilai[i];
}
cout<<endl;
cout<<”Index Elemen : “;
for(i=0;i<N;i++) 
{
cout<<setw(3)<<i;
}
cout<<endl;
cout<<”Masukkan data yang akan anda cari : “;
cin>>Bilangan;
//proses pencarian data
awal = 0;
akhir = N-1;
do
{
            tengah = (akhir + awal)/2;
            if(Bilangan < Nilai[tengah])
{
                        akhir = tengah -1;
}
else
{
                        awal = tengah + 1;
}
}
while ((akhir >= awal) && (Nilai[tengah] != Bilangan));
{
if (Nilai[tengah] == Bilangan)
{
                                    cout<<endl;
                                    cout<<”Data “<<Bilangan<<” ada dalam array “;
                                    cout<<”Pada posisi “<<tengah;
}
else
{
cout<<endl;
cout<<”Data “<<Bilangan<<” tidak ada dalam array “;
cout<<endl;
}
}
getch();
}

Jika di compile dari coding Binary Search, maka akan tampak seperti gambar di bawah ini:





Sumber           : Buku Konsep dan Implementasi Struktur Data dengan C++
Oleh                : Lamhot Sitorus dan David J.M Sembiring, Andi Kristanto, S.Kom
Penerbit           : Andi dan Graha Ilmu

Sorting ( Selection sort dan Insertion sort ) beserta Contohnya

Nama  : Agung Wijaya Kusuma
NIM     : 140010222
Kelas   : AB141
Nama Dosen : Ida Bagus Kadek Surya Arnawa. S.Kom
Nama Asisten Dosen : Steven Anthony

      E.    Sorting
Sorting adalah proses mengatur sekumpulan objek menurut urutan atau susunan tertentu.Urutan objek dapat menaik ( Ascending ), yaitu urutan objek yang disusun mulai dari Nilai terkecil hingga terbesar atau menurun ( Descending ), yaitu urutan objek yang disusun mulai dari Nilai terbesar hingga terkecil. Untuk dapat melakukan proses pengurutan dapat menggunakan beberapa metode seperti :
1.    Selection sort
2.    Insertion sort

    1.    Selection Sort
Selection Sort adalah suatu metode pengurutan yang membandingkan elemen yang sekarang dengan elemen berikut sampai ke elemen yang terakhir. Jika ditemukan elemen lain yang lebih kecil dari elemen sekarang maka dicatat posisinya dan langsung ditukar.
Misalkan ada data-data sebagai berikut :
2, 34, 22, 1
Daftar bilangan diatas masih belum urut dari kecil ke besar. Kita ingin melakukan pengurutan dari yang terkecil sampai yang terbesar dari 3 data tersebut.
Langkah pertama , membandingkan satu persatu sampai dengan yang terkakhir. Langkah-langkahnya sebagai berikut :
Langkah pertama :
Pembanding                            Posisi
2<34                                        1
2<22                                        1
2<1                                          4
Tukar data pada posisi 1 dengan data posisi 4
Hasil sementara : 1, 34,22,2

Langkah Kedua :
Pembanding                            Posisi
34>22                                      3
22<5                                        4
Tukar data pada posisi 2 dengan data posisi 4
Hasil akhir : 1, 2, 22, 34
Proses pengurutan data di atas memerlukan 2 kali perulangan.

Contoh Selection Sort dalam coding :

#include<iostream.h>
#include<conio.h>
int data[10];
int n;

void tukar(int a, int b)
{
            int t;
   t=data[b];                                                        
   data[b]=data[a];
   data[a]=t;
}

void selection_sort()
{
            int pos,i,j;
   for(i=0;i<n-1;i++)
   {
            pos=i;
      for(j=i+1;j<n;j++)
      {
            if(data[j]<data[pos])pos=j;
      }
      if(pos!=i)
      {
            tukar(pos,i);
      }
   }
   cout<<"selection sort selesai !"<<endl;
   cout<<"Data : "<<endl;
   for(int i=0;i<n;i++)
   {
            cout<<data[i]<<" ";
   }
   cout<<endl;
}



void input()
{
            cout<<"Masukkan jumlah data = ";
   cin>>n;
   for(int i=0;i<n;i++)
   {
            cout<<"Masukkan data ke - "<<(i+1)<<" = " ;
      cin>>data[i];
   }
}


void main()
{
            int pil;
   clrscr();
   do
   {
      clrscr();
            cout<<"1. Input Data"<<endl;
            cout<<"2. Selection Sort"<<endl;
            cout<<"3. Exit"<<endl;
      cout<<"Masukkan Pilihan anda = ";
      cin>>pil;

            switch(pil)
            {
            case 1: input();break;
            case 2: selection_sort();break;
            }
            getch();
   }
   while(pil!=3);
}


     2.    Insertion Sort
Insertion sort merupakan metode pengurutan dengan cara menyisipkan elemen array pada posisi yang tepat. Selama pencarian posisi yang tepat dilakukan pergeseran elemen array.
Misalnya dalam permainan kartu, kartu yang dicabut biasanya disisipkan oleh pemain pada posisi yang tepat sehingga penambahan kartu tersebut membuat semua kartu tetap terurut.
Contoh :
Program untuk mengurutkan elemen array secara menaik dengan metode Insertion sort
/*Program Pengurutan metode Insertion sort
Pengurutan secara Menaik*/
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
void main()
{
            int Nilai[20];
int i, j, k, N;
int temp;
cout<<”Masukkan Banyak Bilangan : “;
cin>>N;
for(i=0;i<N;i++)
{
            cout<<”Elemen ke-“<<i<<” : “;
            cin>>Nilai[i];
}
            //Proses Cetak sebelum diurutkan
            cout<<endl;
            cout<<”Data sebelum diurut : “;
            for(i=0;i<N;i++)
            cout<<setw(3)<<Nilai[i];
            //Proses Pengurutan
            for(i=1;i<N;i++)
           
{
            temp = Nilai[i];
            j=i – 1;
while ((temp <= Nilai[j]) && (j>=1))
{
                        Nilai[j+1]=Nilai[j];
                        j--;
}
            If (temp >= Nilai[j])
            Nilai[j+1] = temp;
            else
            {
                        Nilai[j+1]=Nilai[j];
                        Nilai[j] = temp;
}
cout<<endl;
for(k=0;k<N;k++)
cout<<setw(3)<<Nilai(k);
}
//Proses Cetak setelah diurutkan
cout<<endl;
cout<<”Data setelah diurut : “;
for(i=0; i<N; i++)
cout<<setw(3)<<Nilai[i];
getch();
}
Sumber           : Buku Konsep dan Implementasi Struktur Data dengan C++
Oleh                : Lamhot Sitorus dan David J.M Sembiring, Andi Kristanto, S.Kom
Penerbit           : Andi dan Graha Ilmu