Selasa, 14 Maret 2017

stack & queue pada C++




Pada codingan di bawah ini, kita membuat program QUEUE dengan ketentuan:

a. Memiliki fungsi PUSH/ENQUEUE (input data)
b. Memiliki fungsi POP/DEQUEUE (ambil satu data)
c. Memiliki fungsi CLEAR (delete all data)
d. Memiliki fungsi PRINT (cetak data pada layar)
e. (opsional) jika
user ingin menampilkan data yang diinputkan, maka data tersebut
telah terurut secara
ascending (menggunakan metode sorting )




 

#include<iostream>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#define max 15

using namespace std;

struct queue //Mendefinisikan queue dengan menggunakan struct
{
    int head;
    int tail ;
    int data [15]; // menampung 15 data
};


queue antri;

void queue(int d){
    antri.head=0;
    antri.tail++;
    antri.data[antri.tail]=d;
    cout<<"data berhasil dimasukkan"<<endl;
    cout<<endl;
}


void dequeue()
{
    cout<<"data yang terambil : "<<antri.data[antri.head];
    for (int i=antri.head;i<=antri.tail;i++)
        (antri.data[i]=antri.data[i+1]);
        antri.tail--;
        cout<<endl;
}

int isFull(){
    if (antri.tail==max-1)
        return 1;
    else
        return 0;
}

int isEmpty(){
    if (antri.tail==-1)
    {
        antri.head=-1;
        return 1;
    }
    else
        return 0;
}

void clear(){
    antri.head=antri.tail=-1;
    cout<<"semua data telah terhapus.";
    cout<<endl;
}


void print_as(){
    int j,i;
    int tampung;
    for(i=0;i<=antri.tail;i++)
    {
    for(j=i+1;j<=antri.tail;j++)
        {
            if(antri.data[i]>antri.data[j])
            {
                tampung=antri.data[i];
                antri.data[i]=antri.data[j];
                antri.data[j]=tampung;
            }
        }
    }
    for (int c=0;c<=antri.tail;c++)
    cout<<antri.data[c]<<endl;
    cout<<endl;
}


int main()
{
    int pil;
    int input;
    antri.tail=-1;
    do
    {
        cout<<"Menu :\n";
        cout<<"1. push\n";
        cout<<"2. pop\n";
        cout<<"3. hapus data\n";
        cout<<"4. tampilkan data\n";
        cout<<"5. keluar\n";
        cout<<endl<<"Masukkan Pilihan Anda = ";cin>>pil;
        fflush(stdin);
    switch(pil)
    {
    case 1 :
                                cout<<endl;
        cout<<"1. push ";
        if(isFull()==1){
            cout<<"Stack telah Penuh ! "<<endl;
        }

        else
        cout<<endl<<" Masukkan Data anda = ";cin>>input;
        fflush(stdin);
        queue(input);
        getch();
    break;

    case 2 :
                                                cout<<endl;
            cout<<"2. pop";
            if(isEmpty()==1){
                cout<<endl<<"Stack telah Kosong ! ";
            }

            else
                cout<<endl;
                dequeue();
                                getch();

    break;

                case 3:
                                                cout<<endl;
            cout<<"3. hapus semua data";
            clear();
            cout<<endl<<"Stack Kosong"<<endl;
    break;
    case 4 :
                                                cout<<endl;
            cout<<"4. tampilkan data";
            if(isEmpty()==1){
                cout<<endl<<"Stack Kosong"<<endl;
            }

            else
                cout<<endl<<"Data yang dicetak :  ";                                                  
                                                cout<<endl;
                                                print_as();
                                                getch();
    break;

    case 5:
                                                cout<<endl;
            cout<<endl<<"Keluar dari program"<<endl;
                }
                }while (pil!=6);

                getch();
    return 0;
}



Program ke dua ini,  kita akan mengubah expresi infix ke expresi postfix dan menampilkan hasil dari penghitungan dari expresi_expresi yang ada.



Berikut codingan programnya :


        #include<iostream>
        #include<conio.h>
        #include<string>
        #include<math.h>
        #include<sstream>
        #include<cstdlib>
        using namespace std;
        const int max_stack=30;
        struct type_stack{
         int top;                                                                                                  
         string data[max_stack];
        };
        type_stack stack; // mendeklarasikan variable stack dengan tipe data bentukan (struct type_stack)
        //inisiasi stack awal sebagai stack kosong dengan nilai top= -1
        void init(type_stack &namastack){
         namastack.top = -1;
        }
        //membuat fungsu isFull untuk mengecek apakah stack sudah penuh atau belum
        bool isFull(type_stack namastack, int max_stack){
         if(namastack.top == (max_stack-1))
          return true;
         else
          return false;
        }
        //membuat fungsi isEmpty untuk mengecek apakah stack masih kosong atau sudah terisi
        bool isEmpty(type_stack namastack){
         if(namastack.top == -1)
          return true;
         else
          return false;
        }
        //membuat fungsi Push untuk menambah elemen data pada stack
        void Push(type_stack &namastack, string data){
         namastack.top++;
         namastack.data[namastack.top]=data;
        }
        //membuat fungsi Pop u ntuk menghapus elemen data pada stack yang paling atas
        void Pop(type_stack &namastack){
         //cout<<"data "<<namastack.data[namastack.top]<<" telah terambil...";
         namastack.top--;
        }
        //membuat fungsi Cetak Stack
        void CetakStack_LIFO(type_stack namastack){
         cout << "Data Stack (LIFO) : \n";
         for(int i=namastack.top; i>=0; i--){
          cout<<" "<<namastack.data[i]<<"\n";
         }
        }
        //fungsi memasukkan elemen-elemen string ke stack
        void inputElemen(type_stack &namastack){
         //menginputkan expresi infix
         cout<<"masukkan element \n";
         cout<<"tekan enter setelah selesai menginputkan 1 element,  \n"<<
          "hingga anda menginputkan '=' \n";
         string dataElemen;
         //setiap kali memilih menu 1, maka string dataelemen diberinilai kosong("")
         dataElemen="";
         int elm=0; //untuk menampilkan angka elemen ke pada saat menginputkan elemen
         while(dataElemen != "=") //melakukan perulangan untuk menginput per elemen ekspresi sampai selesai
         {
          elm++;
          cout<<"elemen ke -  "<<elm<< " : ";
          cin>>dataElemen; //menginput dari keyboard 1 elemen
          if(dataElemen!="=") //mengecek jika string dataInfix tidak samadengan "="
          Push(namastack,dataElemen);  //push masing elemen ke stackInfix
         }
        }
        //fungsi untuk mengetahui operator atau bukan (operator)
        bool isOpr(string opr)
        {
         if((opr=="*") || (opr=="/")||(opr=="%")||(opr=="+") || (opr=="-")||(opr=="^"))
         {
          return true;
         }
         else
          return false;
        }
        //fungsi untuk menyimpan derajat presedence
        int presedence(string opr)
        {
         if((opr=="^")||(opr=="!"))
          return 4;
         else if((opr=="*") || (opr=="/")||(opr=="%"))
          return 3;
         else if((opr=="+") || (opr=="-"))
          return 2;
         else
          return 1;
        }
        //fungsi convert infix to postfix
        void infixToPostfix(type_stack &infix, type_stack &postfix){
         string symbol;
         string topSymbolOpr;
         type_stack stackOperator;
         init(stackOperator);
         for(int k=0; k<=infix.top; k++)
         {
          symbol=infix.data[k];
          if((!isOpr(symbol)) && (symbol!="(") && (symbol!=")") ) //jika bukan operator, berarti symbol atau angka
          {
           Push(postfix,symbol);
          }
          else if(isOpr(symbol))
          {
           while((!isEmpty(stackOperator)) && (stackOperator.data[stackOperator.top]!="("))
           {
            topSymbolOpr=stackOperator.data[stackOperator.top];
            if(presedence(topSymbolOpr)>=presedence(symbol))
            {
             Pop(stackOperator);
             Push(postfix,topSymbolOpr);
            }
            else
             break;
           }
           Push(stackOperator,symbol);
          }
          else if(symbol=="(")
          {
           Push(stackOperator,symbol);
          }
          else if(symbol==")")
          {
           while((!isEmpty(stackOperator)) && (stackOperator.data[stackOperator.top]!="("))
           {
            topSymbolOpr=stackOperator.data[stackOperator.top];
            if(presedence(topSymbolOpr)>=presedence(symbol))
            {
             Pop(stackOperator);
             Push(postfix,topSymbolOpr);
            }
            else
             Push(stackOperator,symbol);
           }
           if(stackOperator.data[stackOperator.top]=="(")
            Pop(stackOperator);
           else
            cout<<"kurung '(' tidak dapat ditemukan";
          }
         }
         while(!isEmpty(stackOperator))
         {
          topSymbolOpr=stackOperator.data[stackOperator.top];
          Pop(stackOperator);
          Push(postfix,topSymbolOpr);
         }
        }
        //fungsi untuk menghitung 2 bilangan
        double hitungMat(double operand1, string opr, double operand2)
        {
         if(opr=="+")
          return (operand1 + operand2);
         else if(opr=="-")
          return (operand1 - operand2);
         else if(opr=="*")
          return (operand1 * operand2);
         else if(opr=="/")
          return (operand1 / operand2);
         else if(opr=="")
          return (double)((int)operand1 % (int)operand2);
         else if(opr=="^")
          return (pow(operand1,operand2));
         else
          return 0;
        }
        //fungsi konvert string to double
        double strToDouble(string strangka)
        {
         std::istringstream stm;
         stm.str(strangka);
         double d;
         stm >>d;
         return (d);
        }
        //fungsi konvert double to string
        string doubleToStr(double angka)
        {
         ostringstream ss;
            ss << angka;
            return (ss.str());
        }
        //fungsi eksekusi ekspresi postfix
        string ekskusiPostfix(type_stack &namastackPostfix)
        {
         type_stack stackHasil;
         init(stackHasil);
         string symbol;
         double operand1, operand2;
         for(int i=0; i<=namastackPostfix.top; i++)
         {
          symbol=namastackPostfix.data[i];
          if(!isOpr(symbol))
          {
           Push(stackHasil,symbol);
          }
          else if(isOpr(symbol))
          {
           operand2=strToDouble(stackHasil.data[stackHasil.top]);
           Pop(stackHasil);
           operand1=strToDouble(stackHasil.data[stackHasil.top]);
           Pop(stackHasil);
           double hasilHitungan;
           hasilHitungan=hitungMat(operand1,symbol,operand2);
           Push(stackHasil,doubleToStr(hasilHitungan));
          }
         }
         return stackHasil.data[stackHasil.top];
        }
        int main(){
         type_stack stackInfix;
         type_stack stackPostfix;
         do
         {
         Menu :
          int menu;
          cout<< "             Menu Stack" << endl;
          cout<< endl;
          cout<< " 1) masukkan Infix "<<endl;
          cout<< " 2) ubah Expresi Infix ke expresi Postfix, Tampilkan "<<endl;
          cout<< " 3) Tampilkan Hasil perhitungan Expresi "<<endl;
          cout<< " 4) exit "<<endl;
          cout<< endl;
          cout<< "Masukkan Pilihan anda : ";
          cin>>menu;
          switch(menu)
          {
          case 1:
           init(stackInfix); //inisiasi stackInfix untuk membuat stack kosong
           if(!isFull(stackInfix,max_stack))
           {
            inputElemen(stackInfix);  //memanggil fungsi inputElemen
            cout<<endl;
            cout<<"expresi infix yang telah dimasukkan : ";
            cout<<"    "; for(int i=0; i <=stackInfix.top; i++){cout<<stackInfix.data[i];  }
            cout<<endl;
            cout<<endl;
           }
           else
           {
            cout<<"Maaf, Stack Telah Penuh..!";
           }
           cout<<endl;
           break;
          case 2:
           init(stackPostfix);
           infixToPostfix(stackInfix,stackPostfix);
           cout<<endl;
           cout<<"expresi Postfix  : ";
           cout<<"    "; for(int i=0; i <=stackPostfix.top; i++){cout<<stackPostfix.data[i];  }
           cout<<endl;
           cout<<endl;
           break;
          case 3:
           cout<<endl;
           cout<<"hasil Perhitungan expresi "; for(int i=0; i <=stackPostfix.top; i++){cout<<stackPostfix.data[i];  }
           cout<<"\nadalah :     "<<ekskusiPostfix(stackPostfix)<< endl<<endl;
           break;
          case 4:
           exit(0);
           break;
          default:
           cout <<"\n Input Menu Salah...!!!";
           cout<<"\n Press Any key to return to menu ";
           _getch();
           system("cls");
           goto Menu;
          }
         }while(1);
        }