C++ Program Pengecekan Kata Palindrome Menggunakan Stack dan Queue Linked List 2 Arah

No comments:
1.      TUJUAN
a.       Bisa mengimplementasikan penyimpanan data menggunakan stack pada program
b.      Bisa mengimplementasikan penyimpanan data menggunakan queue pada program
c.       Bisa membuat stack dan queue menggunakan linked – list dua arah
d.      Bisa membuat program untuk pengecekan kata palindrome menggunakan stack dan queue
2.      PERMASALAHAN
      Diinginkan sebuah program yang dapat menerima inputan berupa kata yang kemudian program mampu menentukan apakah kata tersebut adalah kata palindrome atau tidak.

3.      CARA KERJA PROGRAM
a.       Program menerima input dari user.
b.      Input tersebut di simpan di stack dan queue.
c.       Dilakukan proses popping terhadap stack dan queue secara bersamaan dalam satu loop block dengan batasan loop adalah panjang kata yang diinputkan.
d.      Setiap proses loop, hasil popping terhadap stack dibandingkan dengan hasil popping terhadap queue.
e.       Jika perbandingan sama, maka akan diberitahukan kepada user melalui layar monitor bahwa hasil popping queue == hasil popping stack. Sedangkan jika perbandingan tidak sama, maka ditampilkan kepada user melalui layar bahwa hasil popping queue != hasil popping stack.
f.       Jika ada satu saja ketidaksamaan huruf dari kedua popping, maka langsung disimpulkan bahwa kata tersebut tidak palindrome, sedangkan jika semua perbandingan sama maka disimpulkan kata tersebut adalah kata palindrome.

g.      Setelah diketahui hasilnya, program menanyakan user apakah ingin mengecek kata lainnya.

4.      SOURCE CODE PROGRAM
#include <iostream>
#include <string>
using namespace std;

class tumpukan{
public:
    tumpukan(){
        //buat link list kosong
        head=NULL;
        tail=NULL;
        size=0;
    }
    //menambahkan data pada stack/membuat node baru
    void push(char a){
        //buat node baru
        node* tmp = new node;
        //masukkan data ke node
        tmp->data = a;
        //tentukan node setelahnya
        tmp->next = NULL;
        //jika LL kosong
        if(size==0){
            //head dan tail adalah node yg baru dibuat
            head = tmp;
            tail = tmp;
            //node sebelumnya belum ada
            tail->prev = NULL;
        }
        //jika LL tidak kosong
        else{
            //node setelah tail adalah node baru
            tail->next = tmp;
            //node sebelum node baru adalah tail
            tmp->prev = tail;
            //pindahkan tail ke node baru
            tail = tmp;
        }
        //jumlah node bertambah
        size++;
    }
    //mengambil data dan menghapus node yang terakhir
    char pop(){
              //ambil data di tail
              data = tail->data;
              if(head==tail){
                     delete head;
              }
              else{
                     //akses tail
                     node* tmp = tail;
                     //pindah tail
                     tail = tail->prev;
                     //hapus link
                     tail->next = NULL;
                     tmp->prev = NULL;
                     //hapus mantan tail (tmp)
                     delete tmp;
              }
              size--;
        return data;
    }   
private:
    struct node{
        char data;
        node* next;
        node* prev;
    };
   
    node* head;
    node* tail;
    int size;
    char data;
};

class antrian{
public:
    antrian(){
        //buat link list kosong
        head=NULL;
        tail=NULL;
        size=0;
    }
    //menambahkan data pada stack/membuat node baru
    void push(char a){
        //buat node baru
        node* tmp = new node;
        //masukkan data ke node
        tmp->data = a;
        //tentukan node setelahnya
        tmp->next = NULL;
        //jika LL kosong
        if(size==0){
            //head dan head adalah node yg baru dibuat
            head = tmp;
            tail = tmp;
            //node selanjutnya belum ada
            head->prev = NULL;
        }
        //jika LL tidak kosong
        else{
            //node setelah head adalah node baru
            tail->next = tmp;
            //node sebelum node baru adalah head
            tmp->prev = tail;
            //pindahkan head ke node baru
            tail = tmp;
        }
        //jumlah node bertambah
        size++;
    }
    //mengambil data dan menghapus node yang pertama
    char pop(){
              //ambil data di head
              data = head->data;
              if(head==tail){
                     delete head;
              }
              else{
                     //akses head
                     node* tmp = head;
                     //pindah head
                     head = head->next;
                     //hapus link
                     head->prev = NULL;
                     tmp->next = NULL;
                     //hapus mantan head (tmp)
                     delete tmp;
              }
              size--;
        return data;
    }
private:
    struct node{
        char data;
        node* next;
        node* prev;
    };
    node* head;
    node* tail;
    int size;
    char data;
};

int main() {
    //membuat stack
    tumpukan s;
    //membuat queue
    antrian q;
    //membuat variabel bool palindrome
    bool palindrome = true;
    cout<<"Hello World"<<endl<<endl;
    //membuat variabel penampungan kata
    string kata;
    //meminta user memasukkan kata
       char a,b,c;
       do{
              cout<<"Masukkan kata : ";cin>>kata;cout<<endl;
              //loop untuk memasukkan semua isi dari string kata ke stack dan queue
              for(int i=0;i<kata.length();i++){
                     s.push(kata[i]);
                     q.push(kata[i]);
              }
              //loop untuk membandingkan hasil popping dari stack dan queue
              for(int l = 0;l<kata.length();l++){
                     //jika keluaran popping berbeda
                     a = q.pop(); b = s.pop();
                     if(a != b){
                           cout<<a<<" != "<<b<<endl;
                           palindrome = false;
                     }
                     else{
                           cout<<a<<" == "<<b<<endl;
                     }
              }
              //jika semua hasil perbandingan popping stack dan queue sama
              if(palindrome == true){
                     cout<<"Kata tersebut adalah kata palindrome";
              }
              else{
                     cout<<"Kata tersebut tidak palindrome";
              }
              cout<<"\n\nCek kata lainnya ? (Y/N)";cin>>c;cout<<endl;
       }while(c == 'Y' || c == 'y');
       cout<<endl;
    system("pause");
    return 0;
}

5.      SCREENSHOT PROGRAM SAAT DIJALANKAN :

Contoh Program Implementasi Abstract Data Type ( ADT )

No comments:
Makul : Algoritma dan Struktur Data
ABSTRACT DATA TYPE
1.      TUJUAN
Membuat program yang menggunakan abstract data type (ADT)
2.      PERMASALAHAN
Membuat program yang memodelkan hewan peliharan virtual (VPet). Pet memiliki berat dan bisa berstatus lapar dan tidak lapar. Pet bisa diberi makan yang akan berefek pada status laparnya berdasarkan :
- jika berat makanan >=  ½ berat pet, maka pet tidak lapar, jika tidak maka pet lapar
- setiap diberi makan berat pet bertambah ¼ berat makanan
3.      DESAIN
a.       STEP 1 SPESIFICATION

 















b.      STEP 2 APPLICATION
Operation
Discription
c/c++
VPet(b,stts)
Membuat VPet dengan menentukan berat dan status lapar pet. Memberikan nilai pada variabel b yaitu sebagai berat dan variabel stts sebagai bool lapar. (constructor)
VPet charlie(150, false);
VPet()
Membuat VPet tanpa menentukan berat dan status lapar/menggukanan default. Memberikan nilai default kepada berat dan status lapar pet bila pengguna tidak memberikan nilai. (constructor)
VPet::VPet(){
           berat = 100;
           lapar = true;
}
VPet heli;
berimakan(jml)
Memberi VPet makan. Memberikan nilai ke variabel jml yang digunakan sebagai jumlah makanan yang diberi (mutator)
charlie.berimakan(10); atau charlie.berimakan(jml);
getLapar()
Mengakses status bool lapar (accessor)
charlie.getBerat()
double VPet::getBerat(){
            return berat;
}
getBerat()
Mengakses berat VPet
charlie.getLapar()
bool VPet::getLapar(){
            return lapar;
}

c.       STEP 3 IMPLEMENTATION
#include <iostream>
using namespace std;

class VPet {
public:
      //Members Functions
      // (constructors)
      VPet(double berat, bool lapar);
      VPet();

      void berimakan(double jumlah);
      bool getLapar();
      double getBerat();

private:
      // Data Members
      double berat;
      bool lapar;
};

VPet::VPet(double b, bool stts){
      berat = b;
      lapar = stts;
}

VPet::VPet(){
      berat = 100;
      lapar = true;
}

void VPet::berimakan(double jml){
      if(jml >= 0.5 * berat){
            lapar = false;
      }
      else{
            lapar = true;
      }
      berat = berat + 0.25 * jml;
}

double VPet::getBerat(){
      return berat;
}
bool VPet::getLapar(){
      return lapar;
}

void main(){

      VPet charlie(150, false);
      VPet heli;
      double jml;
      cout<<"Jumlah makanan yang diberikan untuk hewan - hewan peliharaan (kg) : ";
      cin>>jml;

      charlie.berimakan(jml);
      heli.berimakan(jml);

      cout<<"Berat Heli : "<<heli.getBerat()<<" kg"<<endl;
      if(heli.getLapar())
      {
            cout<<"Heli masih lapar"<<endl;
      }
      else
      {
            cout<<"Heli tidak lapar"<<endl;
      }
      cout<<"Berat Charlie : "<<charlie.getBerat()<<" kg"<<endl;
      if(charlie.getLapar())
      {
            cout<<"Charlie masih lapar"<<endl;
      }
      else
      {
            cout<<"Charlie tidak lapar"<<endl;
      }

      system("pause"); 
}

                               
                        Program Screenshot :