Notasi Polish, Merubah Infix ke Postfix dan Perhitungannya
Juni 23, 2009 at 4:00 am | In Pemrograman C | 2 CommentsMerubah Notasi Infix ke Notas Postfix. Ini salah satu tugas akhir Struktur Data semester 4 ini. Program ini dibuat dengan menggunakan struktur Stack dan array dinamis atau disebut List. Keterbatasan dari program ini adalah user hanya dapat menginputkan data dari 1-9 dan operator yang digunakan hanya +,-,*,/,^. Untuk kedepan gak janji dikembangkan tapi tetep diusahain.
Oke ini Codenya :
#include "stdio.h"
#include "string.h"
#define MAX 100
#define Kosong -1struct stack
{
char data[MAX];
int top;
};int cekKosong(struct stack *s);
void KosongkanStack(struct stack* s);
void push(struct stack* s,int item);
char pop(struct stack* s);
void tampil(struct stack s);
int cekOperator(char e);
int cekPrioritas(char e);
void konversi(char* infix, char* postfix, int spasi);
int Hitung(char *postfix);int main()
{
char in[50],post[50];gotoxy(1,1);printf("--------------------------------------------------------------------------------");
gotoxy(1,24);printf("--------------------------------------------------------------------------------");
for(i=2; i<24; i++){
gotoxy(1,i);printf("|");
}
for(j=2; jtop == Kosong)
return 1;
else
return 0;
}// fungsi untuk mengosongkan stack
void KosongkanStack(struct stack* s)
{
s->top=Kosong;
}// fungsi untuk memasukan data ke stack
void push(struct stack* s,int item)
{
if(s->top == (MAX-1)) // jika topnya ke max - 1, berarti stack penuh
{
printf("\nStack Penuh, silakan pop atau hapus stack");
}
else //jika tidak
{
++s->top; // naikan stack s, lalu pindahkan topnya
s->data[s->top]=item; // list data dari top diisi dari item
}
}char pop(struct stack* s)
{
char ret=(char)Kosong; // inisialisasi variabel ret = 0 jadi char
if(!cekKosong(s)) // mengecek kosong atau tidak, bila tidak ?
{
ret= s->data[s->top]; //tempatkan ret pada list s di posisi top
--s->top; // lalu mundurkan list s satu list dan jadikan top
// ini berarti ret berada di list paling belakang
}
return ret; // keluarkan si ret
}void tampil(struct stack s)
{
while(s.top != Kosong) // selama s gak kosong
{
printf("\n%d",s.data[s.top]); // tampilkan data list s pada posisi top
s.top--; // mundurkan list ke posisi sebelumnya
}
}// fungsi untuk mengecek operator
int cekOperator(char e)
{
if(e == '+' || e == '-' || e == '*' || e == '/' || e == '^')
{
printf("operator benar\n");
getch();
return 1; // jika operatornya + , - , * , / , ^(pangkat) , berarti OK
}
else
{
printf("oparator salah\n");
getch(); // jika selain operator itu,, anggap invalid operator
return 0;
}
}// fungsi untuk mengecek prioritas suatu operator
int cekPrioritas(char e)
{
int pri = 0; // inisialisasi nilai variabel priif (e == '^')
pri = 3; // jika terdapat tanda pangkat (^), dia menjadi prioritas no wahid
else
{
if(e == '*' || e == '/')
pri = 2; // jika * atau / maka jadi prioritas ke 2
else
{
if(e == '+' || e == '-')
pri = 1; // jika + atau - jadi prioritas ke 3
}
}
return pri; // ngeluarin nilai variabel prioritas
}// Fungsi proses konversinya
void konversi(char* infix, char* postfix, int spasi)
{
char *i,*p;
struct stack X;
char n1;KosongkanStack(&X);
i = &infix[0];
p = &postfix[0];
while(*i) // selama I tidak kosong, berarti ada datanya
{
while(*i == ' ' || *i == '\t') // melewatkan spasi dan tab
{
i++;
}if( isdigit(*i) || isalpha(*i) )
{
while( isdigit(*i) || isalpha(*i))
{
*p = *i;
p++;
i++;
}if(spasi) // jika ada spasi, lewatkan
{
*p = ' ';
p++;
}
}if( *i == '(' )
{
push(&X,*i); // masukan isi I ke stack X
i++;
}if( *i == ')')
{
n1 = pop(&X);
while( n1 != '(' )
{
*p = n1;
p++;
if(spasi)
{
*p = ' ';
p++;
}
n1 = pop(&X);
}
i++;
}if( cekOperator(*i))
{
if(cekKosong(&X))
push(&X,*i);
else
{
n1 = pop(&X);
while(cekPrioritas(n1) >= cekPrioritas(*i))
{
*p = n1;
p++;if(spasi)
{
*p = ' ';
p++;
}
n1 = pop(&X);
}
push(&X,n1);
push(&X,*i);
}
i++;
}
}
while(!cekKosong(&X))
{
n1 = pop(&X);
*p = n1;
p++;
if(spasi)
{
*p = ' ';
p++;
}
}
*p = '';
}int Hitung(char *postfix)
{
char *p;
struct stack stk;
int op1,op2,hasil;cekKosong(&stk);
p = &postfix[0];
while(*p != '')
{
/* code ini untuk menghilangkan spasi dan tab saat perhitungan */
while(*p == ' ' || *p == '\t')
{
p++; // kalo benar ada maka lewatkan ke statement berikutnya
}
if(isdigit(*p))
{
push(&stk,*p - 48);
}
else
{
op1 = pop(&stk);
op2 = pop(&stk);
switch(*p)
{
case '+':{
hasil = op2 + op1;
break;
}
case '-':{
hasil = op2 - op1;
break;
}
case '/':{
hasil = op2 / op1;
break;
}
case '*':{
hasil = op2 * op1;
break;
}
case '^':{
hasil = pow(op2,op1);
break;
}
}
push(&stk,hasil); // tempatkan hasil sementara pada stack
}
p++; // lanjut ke statement berikutnya
}
hasil = pop(&stk); // keluarkan hasil yang tersimpan pada stack
return hasil;
}
Semoga berguna buat yg search mengenai tema ini…
& Komentar »
RSS umpan untuk komentar-komentar dalam tulisan ini. URI Lacak Balik
Tinggalkan komentar
Blog pada WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.
programnya ko masih error ?
Komentar oleh rookies — Juni 28, 2009 #
@rookies :
baca dulu penjelasan diatas..code ini masih error dikit tapi masih bisa dijalanin dikit…
untuk kedepan nti ta coba ulik lagi…
Komentar oleh Adiputra — Juni 30, 2009 #