NAMA : MASRUI NGNGIRI
NIM : E1E115073
NIM : E1E115073
1.Dengan
mengembangkan code berikut, buatlah program STACK dan
QUEUE
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>
#include<stdlib.h>
#define max_stack 15
using namespace std;
struct stack
{
int top;
int data [15];
};
stack tumpuk;
void push(int d){
tumpuk.top++;
tumpuk.data[tumpuk.top]=d;
cout<<"Data berhasil dimasukkan";
cout<<endl<<endl;
}
void pop_des(){
cout<<endl;
cout<<"Data terambil "<<tumpuk.data[tumpuk.top];
cout<<endl;
tumpuk.top--;
}
int isFull(){
if(tumpuk.top==max_stack-1)
return 1;
else
return 0;
}
int isEmpty(){
if(tumpuk.top==-1)
return 1;
else
return 0;
}
void clear(){
tumpuk.top=-1;
cout<<endl;
cout<<"Semua data terhapus";
cout<<endl;
}
void print_as(){
int j,i;
int tampung;
for(i=0;i<=tumpuk.top;i++)
{
for(j=i+1;j<=tumpuk.top;j++)
{
if(tumpuk.data[i]>tumpuk.data[j])
{
tampung=tumpuk.data[i];
tumpuk.data[i]=tumpuk.data[j];
tumpuk.data[j]=tampung;
}
}
}
for (int c=0;c<=tumpuk.top;c++)
cout<<tumpuk.data[c]<<endl;
}
int main()
{
int pil;
int input;
tumpuk.top=-1;
do
{
system("cls");
cout<<endl<<"Menu
Stack"<<endl ;
cout<<"1. Push
"<<endl;
cout<<"2. Pop
"<<endl;
cout<<"3. Hapus Semua Data
"<<endl;
cout<<"4. Tampilkan Data
"<<endl;
cout<<"5. Exit
"<<endl;
cout<<endl<<"Masukkan
Pilihan Anda = ";cin>>pil;
fflush(stdin);
switch(pil)
{
case 1 :
cout<<endl;
cout<<"1.Push ";
if(isFull()==1){
cout<<"Stack Penuh !
"<<endl;
}
else
cout<<endl<<" Masukkan
Data = ";cin>>input;
fflush(stdin);
push(input);
getch();
break;
case 2 :
cout<<endl;
cout<<"2.Pop";
if(isEmpty()==1){
cout<<endl<<"Stack Kosong ! ";
}
else
pop_des();
getch();
break;
case
3:
cout<<endl;
cout<<"3.Clear";
clear();
cout<<endl<<"Stack
Kosong"<<endl;
break;
case 4 :
cout<<endl;
cout<<"";
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 tampilan:
3.Buatlah program untuk
mengkonversi inputan infix menjadi postfix, program tersebut
akan menghasilkan
output berupa hasil konversi ke postfix dan hasil perhitungannya.
(inputan
berupa angka). Code program berikut dapat dijadikan sebagai referensi.
(Code
program ini dapat menghitung hasil operasi dari inputan postfix).
#include<iostream>
#include<conio.h>
#include<string>
#include<math.h>
#include<sstream>
#include<cstdlib>
using namespace std;
const int max_stack=40;
struct type_stack{
int top;
string data[max_stack];
};
type_stack stack;
void init(type_stack &namastack){
namastack.top = -1;
}
bool isFull(type_stack namastack, int
max_stack){
if(namastack.top == (max_stack-1))
return true;
else
return false;
}
bool isEmpty(type_stack namastack){
if(namastack.top == -1)
return true;
else
return false;
}
void Push(type_stack &namastack,
string data){
namastack.top++;
namastack.data[namastack.top]=data;
}
void Pop(type_stack &namastack){
namastack.top--;
}
void CetakStack_LIFO(type_stack
namastack){
cout << "Data Stack (LIFO)
: \n";
for(int i=namastack.top; i>=0;
i--){
cout<<"
"<<namastack.data[i]<<"\n";
}
}
void inputElemen(type_stack
&namastack){
cout<<" Masukkan \n";
cout<<"tekan enter setelah
selesai menginputkan 1 element,
\n"<<
"sampai menginputkan '='
\n";
string dataElemen;
dataElemen="";
int elm=0;
while(dataElemen != "=")
{
elm++;
cout<<"elemen ke
"<<elm<< " : ";
cin>>dataElemen;
if(dataElemen!="=")
Push(namastack,dataElemen);
}
}
bool isOpr(string opr)
{
if((opr=="*") ||
(opr=="/")||(opr=="%")||(opr=="+") ||
(opr=="-")||(opr=="^"))
{
return true;
}
else
return false;
}
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!=")") )
{
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);
}
}
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;
}
double strToDouble(string strangka)
{
std::istringstream stm;
stm.str(strangka);
double d;
stm >>d;
return (d);
}
string doubleToStr(double angka)
{
ostringstream ss;
ss << angka;
return (ss.str());
}
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) Input Infix
"<<endl;
cout<< " 2) Konvert
Expresi Infix ke Postfix, Tampilkan "<<endl;
cout<< " 3) Hasil
perhitungan Expresi, Tampilkan "<<endl;
cout<< " 4) Keluar
"<<endl;
cout<< endl;
cout<< "Masukkan Pilihan :
";
cin>>menu;
switch(menu)
{
case 1:
init(stackInfix);
if(!isFull(stackInfix,max_stack))
{
inputElemen(stackInfix);
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...!!!";
cout<<"\n Press Any key
to return to menu ";
_getch();
system("cls");
goto Menu;
}
}while(1);
}
hasil tampilan:
Tidak ada komentar:
Posting Komentar