Minggu, 07 Juni 2015

Stack (Praktikum Struktur data)



Stack

            STACK (tumpukan) dapat di katakan sebagai list yang operasi penghapusan dan penyisipan elemennya dilakukan di satu ujung atau bisa juga di artikan sebagai suatu kumpulan data yang seolah-olah ada data yang di letakkan di atas data yang lain.
Satu hal yang perlu kita ingat adalah bahwa kita bisa menambah (menyisipkan) 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) “Benda yang terakhir masuk ke dalam stack akan menjadi yang pertama keluar dari stack

Operasi Stack

 Ø  Push
digunakan untuk menambah item pada stack pada tumpukan paling atas
Ø  Pop
digunakan untuk mengambil item pada stack pada tumpukan paling atas
Ø  Print
digunakan untuk mencetak semua data dalam tumpukan
Ø  IsEmpty
fungsi yang digunakan untuk mengecek apakah stack sudah kosong
Ø  IsFull
fungsi yang digunakan untuk mengecek apakah stack sudah penuh

Contoh Stack

Contoh Stack dalam kehidupan sehari-hari adalah seperti tumpukan piring di sebuah restoran yang tumpukannya dapat ditambah pada bagian paling atas dan jika mengambilnya pun dari bagian paling atas pula
                                  

                                      


Inisialisasi Stack

          Pada mulanya isi top dengan  -1, karena array dalam C dimulai dari  0, yang berarti stack adalah kosong. 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. Ilustrasi stack pada saat inisialisasi ditunjukkan pada gambar di bawah ini:


                    




Fungsi IsFull
            Untuk memeriksa apakah stack sudah penuh, maka dapat dilakukan dengan cara   memeriksa   top   of   stack jika   sudah   sama   dengan MAX_STACK-1 maka full. Jika belum (masih lebih kecil dari MAX_STACK-1) maka belum full. Seperti ditunjukkan gambar di berikut ini:

                         


Fungsi Push
            Untuk memasukkan elemen ke stack, selalu menjadi elemen teratas stack. Tambah satu (increment)   nilai top of stack terlebih dahulu setiap kali ada penambahan elemen stack, asalkan stack masih belum penuh, kemudian isikan  nilai  baru  ke  stack  berdasarkan  indeks  top  of  stack  setelah ditambah satu (diincrement). Seperti gambar di berikut ini



                              .



Fungsi Pop
          Untuk mengambil elemen teratas dari stack. Ambil dahulu nilai elemen teratas stack dengan mengakses top of stack, tampilkan nilai yang akan diambil terlebih dahulu, baru didecrement nilai top of stack sehingga jumlah elemen stack berkurang. Seperti gambar di berikut ini

                       

Fungsi IsEmpty
            Untuk memeriksa apakah data Stack masih kosong. Dengan cara memeriksa top of stack, jika masih -1 maka berarti data Stack masih kosong!
                     
Fungsi Print
            Untuk menampilkan semua elemen-elemen data Stack. Dengan cara me-loop semua nilai array secara terbalik, karena kita harus mengakses dari indeks array tertinggi terlebih dahulu baru ke indeks yang lebih kecil!
 
Jenis – jenis Stack
Stack ada dua jenis, yaitu :
1.      Single Stack
2.      Double Stack


  •  Single Stack
     Single Stack dapat direpresentasikan menggunakan array satu dimensi. Prinsip proses single stack adalah LIFO ( Last In First Out). Proses pada single stack yaitu, AWAL (Inisialisasi), PUSH (Insert, Masuk, Simpan, Tulis), POP (Delete, Keluar, Ambil, Baca/Hapus)
                                                                                              
                     Ini adalah gambaran dari Kondisi Stack ditentukan oleh posisi atau isi TOP.
                     

Algoritma Single Stack
1.      Algoritma Push
     If (Top < n-1)                                                                                
            { Top = Top + 1;
                 S[Top] = x;
            }
         else
              cout<<“Stack Penuh”;

2.      Algoritma Pop
     if (Top > -1)                                                                                  
         { x = S[Top];
            Top = Top - 1;
         }
     else
         cout<<“Stack Kosong”;


ü  Double Stack
Double Stack disebut juga Stack Ganda. Prinsip prosesnya LIFO (Last In First Out) baik untuk stack 1 maupun stack 2. Proses pada Double Stack yaitu, AWAL (Inisialisasi), PUSH1 (Push untuk Stack 1), POP1 (Pop untuk Stack 1), PUSH2 (Push Untuk Stack 2), POP2 (Pop untuk Stack 2).


                                Ini adalah gambaran dari Kondisi Double Stack
               


Algoritma
a.       Algoritma Push 1 (mengisi Stack 1)
Periksa apakah Stack1 BISA DIISI
     
      if (Top2 – Top1 > 1)              
                  {           Top1 = Top1 + 1;
                              S[Top1] = x;
                  }
      else
                  cout<<“Stack Penuh”;

b.      Algoritma Pop 1 (mengambil isi Stack 1)
Periksa apakah Stack1 ADA ISINYA
     
      if (Top1 > -1)             
                  {           x = S[Top1];
                              Top1 = Top1 - 1;
                  }
      else
                  cout<<“Stack Kosong”;

c.       Algoritma Push 2 (mengisi isi Stack 2)
Periksa apakah Stack2 BISA DIISI
     
      if (Top2 – Top1 > 1)              
                  {           Top2 = Top2 - 1;
                              S[Top2] = x;
                  }
      else
                  cout<<“Stack Penuh”;

d.      Algoritma Pop 2 (mengambil isi Stack 2)
Periksa apakah Stack2 ADA ISINYA
     
      if (Top2 < n)               
                  {           x = S[Top2];
                              Top2 = Top2 + 1;
                  }
      else
                  cout<<“Stack Kosong”;






Contoh Program Single Stack

#include <iostream.h>
#include <conio.h>

int nilai[5]; //variabel global
int top, max; //variabel global
int menu; //variabel untuk menu

void create()
{
            top = -1;
   max = 4;
}

bool isFull()
{
            if (top == max)
   {
            return true;
   }
   else
   {
            return false;
   }
}

bool isEmpty()
{
            if (top == -1)
   {
            return true;
            }
   else
   {
            return false;
   }
}

void main()
{
            create(); //panggil prosedur create, set nilai awal STACK

            home: //penanda/check point
            clrscr(); //untuk hapus layar

   cout<<"Pilih salah satu menu dibawah ini : "<<endl;
   cout<<"1. Push"<<endl;
   cout<<"2. Pop"<<endl;
   cout<<"3. Print"<<endl;
   cout<<"4. Clear"<<endl;
   cout<<"Masukkan pilihan anda (1-4) : ";
   cin>>menu;

   switch(menu)
   {
            case 1:
            if (isFull() == true)
         {
            cout<<"STOP...STACK Penuh..!!";
         }
         else
         {

            top++;
            cout<<"Masukkan data ke STACK : ";
            cin>>nilai[top];
            cout<<"Data "<<nilai[top]<<" masuk ke STACK";
         }
      getch();
      goto home;
      break;

      case 2:
            if (isEmpty() == true)
         {
            cout<<"STACK kosong!";
         }
         else
         {
            cout<<"Data yang keluar : ";
            cout<<nilai[top];
                                                top--;
         }
      getch();
      goto home;
      break;

      case 3:
            if (isEmpty() == true)
         {
            cout<<"STACK kosong, tidak dapat menampilkan data";
         }
         else
         {
            cout<<"Data yang masuk ke STACK : "<<endl;
            for(int i=0; i<=top; i++)
            {
                        cout<<nilai[i]<<" ";
            }
         }
      getch();
      goto home;
      break;

      case 4:
            top = -1;
         cout<<"STACK sudah di kosongkan";
                        getch();
      goto home;
      break;
            }
   getch();
}




Contoh Program Double Stack

#include <iostream.h>
#include <conio.h>

int nilai [5];
int top1, top2, menu, stack, pop;

void create()
{
            top1=-1;
   top2=5;
   stack=1;
   pop=1;
}

bool isfull()
{
            if(top2-top1==1)
   {
            return true;
   }
   else
   {
            return false;
   }
}

bool isempty1()
{
            if(top1==-1)
   {
            return true;
   }
   else
   {
            return false;
   }
}

bool isempty2()
{
            if(top2==5)
   {
            return true;
   }
   else
   {
            return false;
   }
}

void main()
{
            create();
   home:
   clrscr();
   cout<<"1. Push"<<endl;
   cout<<"2. Pop"<<endl;
   cout<<"3. Print"<<endl;
   cout<<"4. Clear"<<endl;
   cout<<"Masukkan pilihan anda (1-4) : ";
   cin>>menu;
   switch(menu)
   {
            case 1:

            if(isfull()==true)
         {
            cout<<"Stack Penuh !";
         }
         else
         {
            if (stack==1)
            {
                        top1++;
                        cout<<"Masukkan data ke stack 1 : ";
                        cin>>nilai[top1];
               stack++;
            }
            else if (stack==2)
            {
                        top2--;
               cout<<"Masukkan data ke stack 2 : ";
                        cin>>nilai[top2];
               stack--;
            }
         }
      getch();
      goto home;
      break;

      case 2:
            if (pop==1)
         {
            if(isempty1()==true)
            {
                        cout<<"Stack 1 kosong !";
            }
            else
            {
                        cout<<"Nilai yang keluar dari stack 1 : "<<nilai[top1];
               top1--;
               pop++;
            }
         }
         else if (pop==2)
         {
            if(isempty2()==true)
            {
                        cout<<"Stack 2 kosong !";
            }
            else
            {
                        cout<<"Nilai yang keluar dari stack 2 : "<<nilai[top2];
               top2++;
               pop--;
            }
         }
      getch();
      goto home;
      break;

      case 3:
         if(isempty1()==true)
         {
                                                cout<<"Stack 1 kosong !";
         }
         else
         {
            cout<<"Data pada stack : ";
            for(int i=0; i<=top1; i++)
            {
                        cout<<nilai[i]<<" ";
            }

            for (int i=(top1+1); i<=(top2-1); i++)
            {
                        cout<<" _ ";
            }
         }

         if(isempty2()==true)
         {
            cout<<"Stack 2 kosong !";
         }
         else
         {

            for(int i=4; i>=top2; i--)
            {
                        cout<<nilai[i]<<" ";
            }
         }
      getch();
      goto home;
      break;

      case 4:
            top1=-1;
         top2=5;
         cout<<"Stack sudah kosong !";
      getch();
      goto home;
      break;
   }
            getch();
}
http://www.lecturer.ukdw.ac.id/anton/download/TIstrukdat4.ppt

1 komentar: