diff --git a/infixToPostfixConversion.c b/infixToPostfixConversion.c new file mode 100644 index 0000000000000000000000000000000000000000..0be8fceaeb8c9e6ecffb0e3c1428b5e0d4928047 --- /dev/null +++ b/infixToPostfixConversion.c @@ -0,0 +1,105 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +typedef struct Node { + char data; + struct Node* before; +} Node; + +Node* push(Node* node, char data) { + Node* new = (Node*)malloc(sizeof(Node)); + new->data = data; + new->before = node; + + return new; +} + +Node* pop(Node* node) { + if(node == NULL) { + return node; + } + Node* ptr = node; + node = node->before; + free(ptr); + return node; +} + +Node* erase(Node* node) { + if(node == NULL) { + return NULL; + } + while(node->before != NULL) { + Node* ptr = node; + node = node->before; + free(ptr); + } + + free(node); + node = NULL; + return node; +} + +int precedence(char c) { + if(c == '+' || c == '-') return 1; + else if(c == '*' || c == '/' || c == '%') return 2; + else return 0; +} + +int main() { + char exp[1000]; + char hasil[1000]; + for(int i=0; i<1000; ++i) hasil[i] = 0; + printf("Enter an expression: "); + scanf("%s", exp); + size_t len = strlen(exp); + exp[len] = ')'; + exp[len+1] = 0; + int idx = 0; + int i_hasil = 0; + Node* stack = NULL; + stack = push(stack, '('); + + while(idx != len+1) { + char now = exp[idx++]; + printf("%s\n", hasil); + if(now == '(') { + stack = push(stack, now); + } + else if(now == '+' || now == '-' || now == '*' || now == '/' || now == '%') { + while(1) { + int now_pres = precedence(now); + int stack_pres = precedence(stack->data); + if(stack_pres >= now_pres) { + hasil[i_hasil++] = stack->data; + stack = pop(stack); + } + else { + + stack = push(stack, now); + break; + } + } + + } + else if(now == ')') { + char operator = stack->data; + while(operator != '(') { + hasil[i_hasil++] = operator; + stack = pop(stack); + operator = stack->data; + } + stack = pop(stack); + } + else { + hasil[i_hasil++] = now; + } + } + while(stack != NULL) { + char now = stack->data; + if(now == '(') break; + hasil[i_hasil++] = stack->data; + stack = pop(stack); + } + printf("%s\n", hasil); +} \ No newline at end of file