Senin, 04 Maret 2019

STACK (Tumpukan)

Stack (Tumpukan) Pada C++

     A.     Pengertian Stack
Stack adalah sebuah kumpulan data dimana data yang diletakkan di atas data  yang lain. Dengan demikian stack adalah struktur data yang menggunakan konsep LIFO(Last In First Out). Dengan demikian, elemen terakhir yang disimpan dalam stack menjadi elemen pertama yang diambil. Dalam proses komputasi, untuk meletakkan sebuah elemen pada bagian atas dari stack, maka dilakukan operasi push. Dan untuk memindahkan dari tempat yang atas tersebut, maka dilakukan operasi pop.    


B. Operasi Pada Stack

Operasi utama pada stack yaitu push untuk menambahkan data ke dalam stack dan pop untuk mengeluarkan atau menghapus data dari stack.

    1. Menambahkan Data Ke stack

Proses penambahan data ke dalam stack disebut operasi Push.
Langkah - langkah operasi push diantaranya.
1.      Memeriksa apakah tumpukan(stack) penuh
2.      Jika tumpukan penuh, maka sudah tidak ada ruang untuk memasukkan data ke tumpukan, jadi cukup tampilkan pesan bahwa tumpukan sudah penuh.
3.      Jika masih ada ruang, tambahkan satu nilai pada atas(top) tumpukan untuk menunjukkan ke ruang kosong selanjutnya
4.      Menambahkan data dimana ruang kosong yang telah ditunjuk oleh top.

  2. Menghapus Data dari stack

        Mengambil data bersamaan dengan menghapus data dari stack disebut dengan operasi pop. Elemen pada stack tidak benar - benar terhapus hanya saja penunjuk ruang(top) di kurangi nilainya dengan satu. Tapi pada implementasi stack sendiri pop akan benar-benar menghapus data tersebut dari tumpukan.
Langkah - langkah operasi pop diantaranya.:
1.      Memeriksa apakah tumpukan kosong.
2.      Jika tumpukan kosong, maka sudah tidak ada lagi data untuk dihapus, maka cukup tampilkan         pesan bahwa tumpukan kosong.
3.      Jika masih ada data pada tumpukan, maka akses data yang paling atas (top)
4.      kemudian mengurangi nilai penunjuk top.

C. Program Stack

1.      Untuk mengimplementasikan program stack di C++ kita membutuhkan tiga method atau fungsi push(); untuk menambahkan data ke tumpukan, pop(); untuk me ngeluarkan data dari tumpukan dan printStack() untuk menampilkan data yang ada di tumpukan.
2.      Selain tiga fungsi tersebut, kita akan membuat dua fungsi opsional untuk mengecek apakah tumpukan kosong isEmpty() dan tumpukan penuh isFull().
3.      Untuk menyimpan data kita bisa menggunakan empty array dengan maksimum array yang nanti akan kita definisikan sebagai maksimum tumpukan.
4.      Agar data tumpukannya terstruktur kita bisa menggunakan struct sehingga lebih mudah mengakses data top dan array datanya sendiri seperti sebuah object.
5.      Karena ini adalah program konsole maka tentu kita juga akan membuat fungsi main().


D. Syntax program

//header file
#include <iostream>
#include <conio.h>
#define maxstack 5
using namespace std; //untuk melegalkan header iostream

//pendeklarasian struct
struct STACK
{
      int top;
      float data[4];
};
float dta;

/*struct yang telah dibuat (STACK) dijadikan suatu Tipe data, dimana disebut tipe data abstrak*/
struct STACK stackbaru;

//fungsi boolean untuk mengetahui apakah stack penuh
bool isfull()
{
      if(stackbaru.top == maxstack)
            return true;
      else
            return false;
}

//fungsi boolean untuk mengetahui apakah stack kosong
bool isempty()
{
      if(stackbaru.top == -1)
            return true;
      else
            return false;
}

//fungsi untuk menambahkan data pada stack
void push(float dta)
{
     if(isfull() == true) /*panggil fungsi isempty(), jika kondisi benar pernyataan dijalankan*/
      {
            puts("Maaf, stack penuh");
      }
      else{
            stackbaru.top++;
            stackbaru.data[stackbaru.top]=dta;
      }
}

//fungsi untuk mengambil data pada stack
void pop()
{
      if(isempty() == true) //panggil fungsi isempty(), jika kondisi benar pernyataan dijalankan
      {
            cout<<"Data telah kosong!";
      }
      else
      {
            cout<<"Data yang terambil : " <<stackbaru.data[stackbaru.top]<<endl;
            stackbaru.top--;
      }
}

//fungsi untuk mencetak data pada stack
void print()
{
      printf("\nData yang terdapat dalam stack : \n");
      printf("--------------------------------\n");
      for(int i=0; i<=stackbaru.top; i++)
      {
            cout<<stackbaru.data[i]<<"    ";
      }
}

//fungsi untuk membersihkan data dalam stack
void clear()
{
      stackbaru.top = -1;
      printf("\nSekarang stack kosong");
}

//fungsi utama
int main()
{
      stackbaru.top = -1;
      //pendeklarasian variabel
      char menu;
      char ulang;
      //perulangan dengan do-while
      do
      {
            system("cls");
            printf("\t PROGRAM STACK\n");
            printf("\t===============\n");
            printf("Menu : ");
            puts("\n1. Pop stack");
            puts("2. Push stack");
            puts("3. Cetak");
            puts("4. Bersihkan stack");
            puts("5. Exit");
           
            cout<<"Menu pilihan Anda : ";
            cin>>menu;
           
            if(menu == '1')
            {
                  pop(); //panggil fungsi pop()
                  ulang = 'y';
                  getch();
            }
            else if(menu == '2')
            {
                  cout<<"\nTambah Data";
                  cout<<"\n-----------";
                  cout<<"\nData yang akan disimpan di stack : ";
                  cin>>dta;
                 push(dta); /*panggil fungsi push(dta)--dta sesuai dengan data ynag diinput*/
                  ulang = 'y';
            }
            else if(menu == '3')
            {
                  print(); /*panggil fungsi untuk mencetak data dalam stack*/
                  cout<<"\n\nUlang ? (y/t)";
                  cin>>ulang;
            }
            else if(menu == '4')
            {
                  clear(); //panggil fungsi untuk membersihkan stack
                  cout<<"\n\nUlang ? (y/t)";
                  cin>>ulang;
            }
            else if(menu == '5')
            {
                  exit(0); //keluar dari program
            }
       }while(ulang == 'Y' || ulang == 'y'); /*akan selalu diulang ketika ulang == 'y' || ulang'Y'*/
} 



E. Penjelasan dan Algoritma: 
1) Pada awalnya dibuat sebuah struct ‘struct STACK’, kemudian struct stack dijadikan menjadi sebuah tipe data dari variabel stackbaru.  Dan beberapa prototype fungsi diantaranya :
    o   void clear()
    o   void print()
    o    void pop()
    o   void push(float dta)
    o   bool isempty()
    o   bool isfull()
 
2) Masuk ke fungsi main, deklarasikan variabel. Kemudian masuk ke perulangan do-while dengan kondisi ketika ulang == ‘y’ || ulang ‘Y’.Pada perulangan ini akan ditampilkan beberapa menu pilihan yang dapat dipilih oleh user :

 printf("Menu : ");
  puts("\n1. Pop stack");
  puts("2. Push stack");
  puts("3. Cetak");
  puts("4. Bersihkan stack");
  puts("5. Exit");

/*note = puts(put string), kegunaannya sama dengan printf ataupun cout, hanya saja yang dicetak hanyalah berupa STRING.*/


3)  Jika input user== ‘1’ maka program akan menjalankan seluruh pernyataan yang ada pada kondisi pertama,   pop(); //panggil fungsi pop()
Fungsi POP :
 void pop()
{
    if(isempty() == true) //panggil fungsi isempty(), jika kondisi benar pernyataan dijalankan
    {
       cout<<"Data telah kosong!";
    }
    else
    {
       cout<<"Data yang terambil : " <<stackbaru.data[stackbaru.top]<<endl;
       stackbaru.top--;
    }
       }

      Pertama kali yang akan dilakukan program adalah mengecheck apakah stack dalam keadaan kosong, jika benar maka akan tercetak string pada layar “Data telah kosong!" . Jika bernilai false maka data pada posisi teratas akan diambil, dan kemudian nilai stackbaru.top didecrement sehingga posisi teratas pada stack berganti dengan data dibawah top sebelumnya.
ulang = 'y';

Setelah fungsi pop() dijalankan, selanjutnya variabel ulang disetel dengan Nilai ‘y’ Sehingga setelah memilih menu pop() program akan secara otomatis mengulangi prosesnya. 
getch(); //akan meminta input dari keyboard sehingga akan menghentikan program sementara sampai adanya input keyboard.

 
     4) Jika input user == ‘2’, maka pernyataan yang berada di dalam kondisi ke dua akan dijalankan. Saat 
     masuk dalam pernyataan pada kondisi kedua maka akan tercetak String pada layar dan kemudian user 
     diminta untuk mengisikan data yang akan ditambahkan dalam tumpukan stack.
cout<<"\nTambah Data";
                     cout<<"\n-----------";
                     cout<<"\nData yang akan disimpan di stack : ";
                     cin>>dta;
Data yang telah diinputkan disimpan dalam memori, dan digunakan untuk  pemanggilan fungsi push(data).
push(dta); /*panggil fungsi push(dta)--dta sesuai dengan data ynag diinput*/

   

   Fungsi PUSH :
void push(float dta)
{
       if(isfull() == true) /*panggil fungsi isempty(), jika kondisi benar pernyataan dijalankan*/
{
   puts("Maaf, stack penuh");
}
else{
   stackbaru.top++;
   stackbaru.data[stackbaru.top]=dta;
}
 }

           Pertama kali akan dicek apakah stack dalam keadaan penuh, jika true maka akan tercetak string pada layar “Maaf, stack penuh”. Jika bernilai salah maka stackbaru.top akan diincrement kemudian data yang tadi diinputkan ditambahkan pada stack.                  
                                                               ulang = 'y';
Setelah fungsi push() dijalankan, selanjutnya variabel ulang disetel dengan Nilai ‘y’ Sehingga setelah memilih menu push() program akan secara otomatis mengulangi prosesnya. 

5)  Jika input user==’3’, maka program akan menjalankan seluruh pernyataan yang berada di dalam kondisi ketiga. 
           print(); /*panggil fungsi untuk mencetak data dalam stack*/
Fungsi PRINT :
printf("\nData yang terdapat dalam stack : \n");
printf("--------------------------------\n");
for(int i=0; i<=stackbaru.top; i++)
{
      cout<<stackbaru.data[i]<<"    ";
       }
 Dengan memanfaatkan perulangan for, fungsi ini akan mencetak seluruh data yang berada di dalam stack.
       cout<<"\n\nUlang ? (y/t)";
       cin>>ulang;
Setelah data tercetak pada layar, selanjutnya akan ditampilkan string “Ulang ?(y/n)”. Jika input user adalah ‘y’ || ‘Y’ maka program akan dijalankan lagi mulai awal (diulang), tapi jika input user == ‘n’ ||’N’ maka akan keluar dari perulangan dan selanjutnya keluar dari program.


6) Jika Input user == ‘4’, maka seluruh pernyataan yang berada dalam kondisi keempat akan dijalankan.
             clear(); //panggil fungsi untuk membersihkan stack
Fungsi CLEAR :
            void clear()
{
   stackbaru.top = -1;  
   printf("\nSekarang stack kosong");
}

          Saat fungsi ini dipanggil maka posisi stackbaru.top diinisialisasi beraada pada -1. Seperti halnya mereset ulang suatu stack yang membuat isinya akan hilang.
 cout<<"\n\nUlang ? (y/t)";
 cin>>ulang;
Setelah data dalam stack dibersihkan, selanjutnya akan ditampilkan string “Ulang ?(y/n)”. Jika input user adalah ‘y’ || ‘Y’ maka program akan dijalankan lagi mulai awal (diulang), tapi jika input user == ‘n’ ||’N’ maka akan keluar dari perulangan dan selanjutnya keluar dari program.


7) Jika input user ==’5’ maka pernyataan yang berada pada kondisi kelima kan dijalankan   
                                   exit(0);
           Pernyataan diatas digunakan untuk keluar dari program. Jadi jika kita memilih menu 5 maka kita akan keluar dari program.
***Penjelasan fungsi boolean isfull() dan bool isempty()***
//fungsi boolean untuk mengetahui apakah stack penuh
bool isfull()
{
      if(stackbaru.top == maxstack)
            return true;
      else
            return false;
}
      Untuk mengetahui apakah suatu stack sedang penuh adalah dengan membandingkan stackbaru.top dengan maxstack, jika kondisi benar maka stack dalam posisi penuh, dan sebaliknya.

//fungsi boolean untuk mengetahui apakah stack kosong
bool isempty()
{
      if(stackbaru.top == -1)
            return true;
      else
            return false;
}


      Untuk mengetahui apakah suatu stack dalam keadaan kosong adalah dengan membandingkan stackbaru.top dengan -1, jika kondisi benar maka stack dalam posisi kosong, dan sebaliknya.

 

OUTPUT :
o   Push Stuck

 
o   Pop Stack

o   Cetak stuck




 REFERENSI:











Tidak ada komentar:

Posting Komentar