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);
}




