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 :