From d308f7769105f8c9d0a585c733eebeb16bb7a8df Mon Sep 17 00:00:00 2001 From: Mebin Thattil Date: Tue, 18 Nov 2025 11:36:24 +0530 Subject: [PATCH 1/2] refactor: use expression trees for evalution --- DSA_Project1/calc.h | 15 +++-- DSA_Project1/calculator | Bin 56648 -> 57112 bytes DSA_Project1/eval.c | 134 +++++++++++++++++++++++++++++++--------- DSA_Project1/main.c | 4 +- DSA_Project1/stack.c | 8 --- 5 files changed, 114 insertions(+), 47 deletions(-) diff --git a/DSA_Project1/calc.h b/DSA_Project1/calc.h index abd4f33..c9d8388 100644 --- a/DSA_Project1/calc.h +++ b/DSA_Project1/calc.h @@ -3,11 +3,6 @@ #define EXPR_MAX 100 -typedef struct { - double data[EXPR_MAX]; - int top; -} numstack; - typedef struct { char data[EXPR_MAX]; int top; @@ -24,9 +19,6 @@ typedef struct { int top; } nodestack; -void pushNum(numstack *s, double val); -double popNum(numstack *s); - void pushOp(opstack *s, char op); char popOp(opstack *s); char peekOp(opstack *s); @@ -38,6 +30,13 @@ int precedence(char op); double applyOp(double a, double b, char op); int isOperator(char c); +Node* createNode(const char *data); +Node* buildTreeFromInfix(const char *expr); +Node* buildTreeFromPostfix(const char *expr); +Node* buildTreeFromPrefix(const char *expr); +double evaluateTree(Node *root); +void freeTree(Node *root); + double eval(const char *expr); double evalPostfix(const char *expr); double evalPrefix(const char *expr); diff --git a/DSA_Project1/calculator b/DSA_Project1/calculator index 3a331a7221a23d0daae79f7a9483aae485e7ede7..d706aac4e089bf0475b8681e48bdfab6b20105d6 100755 GIT binary patch literal 57112 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 literal 56648 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 #include "calc.h" +Node* createNode(const char *data) { + Node *newNode = (Node*)malloc(sizeof(Node)); + strcpy(newNode->data, data); + newNode->left = NULL; + newNode->right = NULL; + return newNode; +} + +void freeTree(Node *root) { + if (root == NULL) return; + freeTree(root->left); + freeTree(root->right); + free(root); +} + +double evaluateTree(Node *root) { + if (root == NULL) return 0; + + // operand is leaf node + if (root->left == NULL && root->right == NULL) { + return atof(root->data); + } + + // recursive evaluation + double leftVal = evaluateTree(root->left); + double rightVal = evaluateTree(root->right); + + return applyOp(leftVal, rightVal, root->data[0]); +} + int precedence(char op) { if (op == '+' || op == '-') return 1; if (op == '*' || op == '/') return 2; @@ -25,8 +55,8 @@ int isOperator(char c) { return (c == '+' || c == '-' || c == '*' || c == '/'); } -double eval(const char *expr) { - numstack values = {.top = -1}; +Node* buildTreeFromInfix(const char *expr) { + nodestack nodes = {.top = -1}; opstack ops = {.top = -1}; int i = 0, len = strlen(expr); @@ -46,7 +76,7 @@ double eval(const char *expr) { numStr[j++] = expr[i++]; numStr[j] = '\0'; - pushNum(&values, atof(numStr)); + pushNode(&nodes, createNode(numStr)); continue; } @@ -58,7 +88,7 @@ double eval(const char *expr) { numStr[j++] = expr[i++]; numStr[j] = '\0'; - pushNum(&values, atof(numStr)); + pushNode(&nodes, createNode(numStr)); } else if (expr[i] == '(') { pushOp(&ops, expr[i]); @@ -66,20 +96,30 @@ double eval(const char *expr) { } else if (expr[i] == ')') { while (ops.top != -1 && peekOp(&ops) != '(') { - double b = popNum(&values); - double a = popNum(&values); + Node *right = popNode(&nodes); + Node *left = popNode(&nodes); char op = popOp(&ops); - pushNum(&values, applyOp(a, b, op)); + + char opStr[2] = {op, '\0'}; + Node *opNode = createNode(opStr); + opNode->left = left; + opNode->right = right; + pushNode(&nodes, opNode); } popOp(&ops); i++; } else { - while (ops.top != -1 && precedence(peekOp(&ops)) >= precedence(expr[i])) { - double b = popNum(&values); - double a = popNum(&values); + while (ops.top != -1 && peekOp(&ops) != '(' && precedence(peekOp(&ops)) >= precedence(expr[i])) { + Node *right = popNode(&nodes); + Node *left = popNode(&nodes); char op = popOp(&ops); - pushNum(&values, applyOp(a, b, op)); + + char opStr[2] = {op, '\0'}; + Node *opNode = createNode(opStr); + opNode->left = left; + opNode->right = right; + pushNode(&nodes, opNode); } pushOp(&ops, expr[i]); i++; @@ -87,17 +127,29 @@ double eval(const char *expr) { } while (ops.top != -1) { - double b = popNum(&values); - double a = popNum(&values); + Node *right = popNode(&nodes); + Node *left = popNode(&nodes); char op = popOp(&ops); - pushNum(&values, applyOp(a, b, op)); + + char opStr[2] = {op, '\0'}; + Node *opNode = createNode(opStr); + opNode->left = left; + opNode->right = right; + pushNode(&nodes, opNode); } - return popNum(&values); + return popNode(&nodes); } -double evalPostfix(const char *expr) { - numstack values = {.top = -1}; +double eval(const char *expr) { + Node *tree = buildTreeFromInfix(expr); + double result = evaluateTree(tree); + freeTree(tree); + return result; +} + +Node* buildTreeFromPostfix(const char *expr) { + nodestack nodes = {.top = -1}; int i = 0, len = strlen(expr); while (i < len) { @@ -118,12 +170,17 @@ double evalPostfix(const char *expr) { numStr[j++] = expr[i++]; numStr[j] = '\0'; - pushNum(&values, atof(numStr)); + pushNode(&nodes, createNode(numStr)); } else if (isOperator(expr[i])) { - double b = popNum(&values); - double a = popNum(&values); - pushNum(&values, applyOp(a, b, expr[i])); + Node *right = popNode(&nodes); + Node *left = popNode(&nodes); + + char opStr[2] = {expr[i], '\0'}; + Node *opNode = createNode(opStr); + opNode->left = left; + opNode->right = right; + pushNode(&nodes, opNode); i++; } else { @@ -131,11 +188,18 @@ double evalPostfix(const char *expr) { } } - return popNum(&values); + return popNode(&nodes); } -double evalPrefix(const char *expr) { - numstack values = {.top = -1}; +double evalPostfix(const char *expr) { + Node *tree = buildTreeFromPostfix(expr); + double result = evaluateTree(tree); + freeTree(tree); + return result; +} + +Node* buildTreeFromPrefix(const char *expr) { + nodestack nodes = {.top = -1}; int len = strlen(expr); int i = len - 1; @@ -166,12 +230,17 @@ double evalPrefix(const char *expr) { } numStr[j] = '\0'; - pushNum(&values, atof(numStr)); + pushNode(&nodes, createNode(numStr)); } else if (isOperator(expr[i])) { - double a = popNum(&values); - double b = popNum(&values); - pushNum(&values, applyOp(a, b, expr[i])); + Node *left = popNode(&nodes); + Node *right = popNode(&nodes); + + char opStr[2] = {expr[i], '\0'}; + Node *opNode = createNode(opStr); + opNode->left = left; + opNode->right = right; + pushNode(&nodes, opNode); i--; } else { @@ -179,5 +248,12 @@ double evalPrefix(const char *expr) { } } - return popNum(&values); + return popNode(&nodes); +} + +double evalPrefix(const char *expr) { + Node *tree = buildTreeFromPrefix(expr); + double result = evaluateTree(tree); + freeTree(tree); + return result; } diff --git a/DSA_Project1/main.c b/DSA_Project1/main.c index 5600541..d999d95 100644 --- a/DSA_Project1/main.c +++ b/DSA_Project1/main.c @@ -15,8 +15,8 @@ int main(int argc, char *argv[]) { printf("2. GUI (Graphical User Interface)\n"); printf("Enter choice (1-2): "); - if (scanf("%d", &mode) != 1) { - mode = 1; // Default to CLI + if (scanf("%d", &mode) != 1) { // Defaults to CLI + mode = 1; } getchar(); diff --git a/DSA_Project1/stack.c b/DSA_Project1/stack.c index 1d56fd8..a686cb1 100644 --- a/DSA_Project1/stack.c +++ b/DSA_Project1/stack.c @@ -2,14 +2,6 @@ #include #include "calc.h" -void pushNum(numstack *s, double val) { - s->data[++(s->top)] = val; -} - -double popNum(numstack *s) { - return s->data[(s->top)--]; -} - void pushOp(opstack *s, char op) { s->data[++(s->top)] = op; } From 804f00155b6143040b8f77abfbc8008da7f2b8c8 Mon Sep 17 00:00:00 2001 From: Mebin Thattil Date: Tue, 18 Nov 2025 12:33:02 +0530 Subject: [PATCH 2/2] refactor: instead of building tree from infix expression, convert infix to postfix and use postfix tree builder function. Also added test_cases.txt --- DSA_Project1/calc.h | 4 +- DSA_Project1/calculator | Bin 57112 -> 57064 bytes DSA_Project1/eval.c | 88 +++++++++++++----------------------- DSA_Project1/gui.c | 4 +- DSA_Project1/main.c | 4 +- DSA_Project1/test.txt | 7 ++- DSA_Project1/test_cases.txt | 11 +++++ 7 files changed, 55 insertions(+), 63 deletions(-) create mode 100644 DSA_Project1/test_cases.txt diff --git a/DSA_Project1/calc.h b/DSA_Project1/calc.h index c9d8388..01f3ba2 100644 --- a/DSA_Project1/calc.h +++ b/DSA_Project1/calc.h @@ -31,13 +31,13 @@ double applyOp(double a, double b, char op); int isOperator(char c); Node* createNode(const char *data); -Node* buildTreeFromInfix(const char *expr); +void infixToPostfix(const char *infix, char *postfix); Node* buildTreeFromPostfix(const char *expr); Node* buildTreeFromPrefix(const char *expr); double evaluateTree(Node *root); void freeTree(Node *root); -double eval(const char *expr); +double eval_Infix(const char *expr); double evalPostfix(const char *expr); double evalPrefix(const char *expr); diff --git a/DSA_Project1/calculator b/DSA_Project1/calculator index d706aac4e089bf0475b8681e48bdfab6b20105d6..7d1ca7a4ec1c00f69e879495af2316b60f597f89 100755 GIT binary patch delta 5855 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 delta 5927 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 diff --git a/DSA_Project1/eval.c b/DSA_Project1/eval.c index 656f6c9..9c7931a 100644 --- a/DSA_Project1/eval.c +++ b/DSA_Project1/eval.c @@ -55,94 +55,70 @@ int isOperator(char c) { return (c == '+' || c == '-' || c == '*' || c == '/'); } -Node* buildTreeFromInfix(const char *expr) { - nodestack nodes = {.top = -1}; +void infixToPostfix(const char *infix, char *postfix) { opstack ops = {.top = -1}; - int i = 0, len = strlen(expr); + int i = 0, k = 0, len = strlen(infix); while (i < len) { - if (isspace(expr[i])) { + if (isspace(infix[i])) { i++; continue; } - if (expr[i] == '-' && (i == 0 || expr[i - 1] == '(')) {// expr[i] == '-' for case of unary minus - char numStr[20]; - int j = 0; - numStr[j++] = '-'; + if (infix[i] == '-' && (i == 0 || infix[i - 1] == '(')) {// unary minus + postfix[k++] = '-'; i++; - while (i < len && (isdigit(expr[i]) || expr[i] == '.')) - numStr[j++] = expr[i++]; + while (i < len && (isdigit(infix[i]) || infix[i] == '.')) + postfix[k++] = infix[i++]; - numStr[j] = '\0'; - pushNode(&nodes, createNode(numStr)); + postfix[k++] = ' '; continue; } - if (isdigit(expr[i]) || expr[i] == '.') { - char numStr[20]; - int j = 0; + if (isdigit(infix[i]) || infix[i] == '.') { + while (i < len && (isdigit(infix[i]) || infix[i] == '.')) + postfix[k++] = infix[i++]; - while (i < len && (isdigit(expr[i]) || expr[i] == '.')) - numStr[j++] = expr[i++]; - - numStr[j] = '\0'; - pushNode(&nodes, createNode(numStr)); + postfix[k++] = ' '; } - else if (expr[i] == '(') { - pushOp(&ops, expr[i]); + else if (infix[i] == '(') { + pushOp(&ops, infix[i]); i++; } - else if (expr[i] == ')') { + else if (infix[i] == ')') { while (ops.top != -1 && peekOp(&ops) != '(') { - Node *right = popNode(&nodes); - Node *left = popNode(&nodes); - char op = popOp(&ops); - - char opStr[2] = {op, '\0'}; - Node *opNode = createNode(opStr); - opNode->left = left; - opNode->right = right; - pushNode(&nodes, opNode); + postfix[k++] = popOp(&ops); + postfix[k++] = ' '; } popOp(&ops); i++; } - else { - while (ops.top != -1 && peekOp(&ops) != '(' && precedence(peekOp(&ops)) >= precedence(expr[i])) { - Node *right = popNode(&nodes); - Node *left = popNode(&nodes); - char op = popOp(&ops); - - char opStr[2] = {op, '\0'}; - Node *opNode = createNode(opStr); - opNode->left = left; - opNode->right = right; - pushNode(&nodes, opNode); + else if (isOperator(infix[i])) { + while (ops.top != -1 && peekOp(&ops) != '(' && precedence(peekOp(&ops)) >= precedence(infix[i])) { + postfix[k++] = popOp(&ops); + postfix[k++] = ' '; } - pushOp(&ops, expr[i]); + pushOp(&ops, infix[i]); + i++; + } + else { i++; } } while (ops.top != -1) { - Node *right = popNode(&nodes); - Node *left = popNode(&nodes); - char op = popOp(&ops); - - char opStr[2] = {op, '\0'}; - Node *opNode = createNode(opStr); - opNode->left = left; - opNode->right = right; - pushNode(&nodes, opNode); + postfix[k++] = popOp(&ops); + postfix[k++] = ' '; } - return popNode(&nodes); + postfix[k] = '\0'; } -double eval(const char *expr) { - Node *tree = buildTreeFromInfix(expr); +double eval_Infix(const char *expr) { + char postfix[EXPR_MAX * 2]; + infixToPostfix(expr, postfix); + Node *tree = buildTreeFromPostfix(postfix); double result = evaluateTree(tree); freeTree(tree); return result; diff --git a/DSA_Project1/gui.c b/DSA_Project1/gui.c index 0547606..c49e4e9 100644 --- a/DSA_Project1/gui.c +++ b/DSA_Project1/gui.c @@ -54,7 +54,7 @@ static void on_calculate_clicked(GtkWidget *widget, gpointer data) { result = evalPrefix(expr); break; default: - result = eval(expr); + result = eval_Infix(expr); break; } @@ -113,7 +113,7 @@ static void on_file_open_clicked(GtkWidget *widget, gpointer data) { result = evalPrefix(expr); break; default: - result = eval(expr); + result = eval_Infix(expr); break; } diff --git a/DSA_Project1/main.c b/DSA_Project1/main.c index d999d95..79116ab 100644 --- a/DSA_Project1/main.c +++ b/DSA_Project1/main.c @@ -91,7 +91,7 @@ int run_cli() { result = evalPrefix(expr); break; default: - result = eval(expr); + result = eval_Infix(expr); break; } printf("%s = %.2f\n", expr, result); @@ -108,7 +108,7 @@ int run_cli() { result = evalPrefix(expr); break; default: - result = eval(expr); + result = eval_Infix(expr); break; } printf("Result: %.2f\n", result); diff --git a/DSA_Project1/test.txt b/DSA_Project1/test.txt index 75d1bbb..205e24e 100644 --- a/DSA_Project1/test.txt +++ b/DSA_Project1/test.txt @@ -1,2 +1,7 @@ ((11-1) * 5) + 2 -10+1 \ No newline at end of file +10+1 +15*2+8-4 +(20-5)/(3+2) +100*2-50+25 +7+8*2-3/3 +(6+4)*(9-3)/2 \ No newline at end of file diff --git a/DSA_Project1/test_cases.txt b/DSA_Project1/test_cases.txt new file mode 100644 index 0000000..978aaaf --- /dev/null +++ b/DSA_Project1/test_cases.txt @@ -0,0 +1,11 @@ +=== Infix Expressions === +3+5*2 = 13.00 +(10+5)*2-3 = 27.00 + +=== Postfix Expressions === +3 5 2 * + = 13.00 +10 5 + 2 * 3 - = 3 + +=== Prefix Expressions === ++ 3 * 5 2 = 13.00 +- * + 10 5 2 3 = 27.00