Selasa, 14 Maret 2017

Queue dan program infix to postfix

1. contoh program queue menggunakan C++

#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){   ///pemanggil untuk program queue
    antri.head=0;
    antri.tail++;
    antri.data[antri.tail]=d;
    cout<<"data berhasil dimasukkan"<<endl;
    cout<<endl;
}


void dequeue()      ///pemanggil untuk program dequeue
{
    cout<<"data 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 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 b=0;b<=antri.tail;b++)
    cout<<antri.data[b]<<endl;
    cout<<endl;
}


int main()
{
    int pilih;
    int input;
    antri.tail=-1;
    do
    {
system("cls");
        cout<<"MENU\n";
        cout<<"1. ENQUEUE\n";
        cout<<"2. DEQUEUE\n";
        cout<<"3. Hapus semua\n";
        cout<<"4. Tampilkan data\n";
        cout<<"5. keluar\n";
        cout<<endl<<"Masukkan Pilihan Anda = ";cin>>pilih;
        fflush(stdin);
    switch(pilih)
    {
    case 1 :
cout<<endl;
        cout<<"1. ENQUEUE ";
        if(isFull()==1){
            cout<<"Stack Penuh ! "<<endl;
        }

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

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

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

    break;

case 3:
cout<<endl;
            cout<<"3. Hapus Semua";
            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;
}
 hasil program nya :




2. contoh program mengubah infix menjadi postfix

        #include<iostream>
        #include<conio.h>
        #include<string>
        #include<math.h>
        #include<sstream>
        #include<cstdlib>


        using namespace std;

        const int max_stack=35;
        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 \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 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<< "         Stack" << endl;
          cout<< endl;
          cout<< "(1) Masukkan Infix "<<endl;
          cout<< "(2) Konversi Infix Menjadi Postfix "<<endl;
          cout<< "(3) Hasil Perhitungan"<<endl;
          cout<< "(4) Keluar "<<endl;
          cout<< endl;
          cout<< "Pilihan : ";
          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 anda masukkan : ";
            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...!!!";
           _getch();
           system("cls");
           goto Menu;
          }
         }while(1);
        }


Tidak ada komentar:

Posting Komentar