Sabtu, 22 Mei 2010

Program konversi Postfix ke Infix

/*
Name: Rudy Tri(5109100031), Anak Agung Ngurah Bagus Trihatmaja(5109100040)
Description: Program ini bertujuan untuk mengubah bentuk postfix menjadi infix dengan menggunakan konsep stack dalam linked list. Program ini meminta inputan berupa string maksimal 100 karakter dan mengeluarkan output berupa char.
*/


/*PREPOSESOR*/
#include
#include
#include
#define MAX 100


/*struct untuk linked list stack*/
typedef struct node
{
node *next;
node *prev;
char opnd;
};

typedef struct node *stack;

/*struct untuk head dan tail linked list*/
typedef struct list
{
stack head,tail;
};


/*untuk membuat node baru diperlukan alokasi memory
fungsi ini bertujuan untuk mengalokasikan memory bagi node*/
stack getnode()
{
stack p;
p =(stack)malloc(sizeof(node));
return (p);
}

/*setelah selesai memakai memory, diperlukan memory release agar kinerja
komputer setelah running program ini tetap baik. Namun tidak terlalu berpengaruh pada
komputer jaman sekarang*/
void freenode(list *lst)
{
stack temp;
for(temp=lst->head;temp!=NULL;temp=temp->next)
free(temp);
}


/*fungsi pop dalam konsep stack. Mengeluarkan elemen terakhir dalam linked list*/
char pop(list *lst)
{
stack temp;
temp=lst->tail;

if(lst==NULL){
printf("stack is empty");
exit(1);
}

while(temp->next!=NULL)//while ini bertujuan untuk mencari elemen terakhir dalam linked list
{
temp=temp->next;
}

if(temp->next==NULL)//apabila node terakhir tersebut telah ditemukan maka return isinya*/
{
return temp->opnd;
}
}

/*fungsi untuk menghapus node terakhir dalam linked list. Pada fungsi pop sebelumnya, elemen terakhir
hanya dikembalikan isinya namun tidak dihapus. Sebenarnya fungsi tersebut bisa saja disederhanakan sehingga
tidak perlu menggunakan fungsi remove last.
*/

void removeLast(list *lst)
{
stack temp;
if(lst== NULL){
printf("stack is empty");
}
else{
temp=lst->tail;
if(lst->head!=lst->tail){
lst->tail = (lst->tail)->prev;
(lst->tail)->next=NULL;
}
else{
lst->head=lst->tail=NULL;
}
free(temp);
}
}

/*fungsi untuk menginputkan elemen ke dalam linked list*/
void push(list *lst, char op)
{
stack temp;

temp = getnode();//alokasi memory
temp->opnd = op;
temp->next = NULL;//dalam C akan lebih baik jika kita menginisialisasikan sebelumnya
temp->prev = NULL;

if(lst->head == NULL){ //jika linked list kosong atau untuk input yang pertama kali
lst->head = temp;
}
else{
/*menghubungkan node yang baru dengan node paling terakhir dalam linked list*/
temp->prev = lst->tail;
lst->tail->next = temp;
}
lst->tail=temp;//mengubah posisi tail dalam linked list
}

/*fungsi ini memberi nilai pada tiap operator untuk menentukan prioritas operator*/
int priority(char e)
{
int pri = 0;
if(e == '^')
pri = 5;
else if(e == '*' || e == '/' || e =='%')
pri = 3;
else if(e == '+' || e == '-')
pri = 1;
return pri;
}

main()
{

/*INISIALISASI*/
list lst;
lst.head=NULL; //inisialisasi head dan tail
lst.tail=NULL;

char inputChar[MAX]; //array untuk menampung input
char opStackfix[MAX];//array untuk menampung output

int count=0; //digunakan sebagai counter indeks dalam array
int charlong=0;//digunakan sebagai counter indeks dalam array
int arrcount=0;//digunakan sebagai counter indeks dalam array


/*INPUT*/
printf("Postfix input is(max. 100 character) : ");
scanf("%s",inputChar);

/*cari banyaknya karakter dalam input, karena berikutnya dalam konversi postfix ke infix karater dibaca dari belakang*/
while(inputChar[charlong]!= '\0')
{
charlong++;
}

for(count=charlong-1;count>=0;count--)//baca input dari belakang
{
if(inputChar[count]=='+' || inputChar[count]=='-' || inputChar[count]=='*' || inputChar[count]=='/' ||inputChar[count]=='^')
push(&lst,inputChar[count]);//selama karakter masukkan ke stack

else{
opStackfix[arrcount]=inputChar[count];//selain karakter inputkan ke array output
arrcount++;
if(lst.head!=NULL){//pop stack selang seling dengan input ke array output
opStackfix[arrcount]=pop(&lst);
removeLast(&lst);
arrcount++;
}

}
}

/*DISPLAY OUTPUT*/
printf("Infix output is : ");

for(arrcount;arrcount>=0;arrcount--)
printf("%c",opStackfix[arrcount]);

getch();
}

Tidak ada komentar:

Posting Komentar