From 9a97c8a43c2686b9dade0cca325128c40add5c81 Mon Sep 17 00:00:00 2001
From: ZakyHermawan <zaky.hermawan9615@gmail.com>
Date: Mon, 14 Jun 2021 04:59:13 +0700
Subject: [PATCH] Add parenthesis checker

---
 parenthesis_checker.c | 87 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 87 insertions(+)
 create mode 100644 parenthesis_checker.c

diff --git a/parenthesis_checker.c b/parenthesis_checker.c
new file mode 100644
index 0000000..90047bc
--- /dev/null
+++ b/parenthesis_checker.c
@@ -0,0 +1,87 @@
+#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 main() {
+    printf("Welcome to parenthesis checker!\n\nenter an expression: ");
+    char expression[1000];
+    scanf("%s", expression);
+
+    int idx = 0;
+    int len = (int)strlen(expression);
+
+    Node* stack = NULL;
+    int valid = 1;
+    
+    while(valid && idx != len) {
+        char now = expression[idx];
+        if(now == '{' || now == '(') {
+            stack = push(stack, now);
+        }
+        else {
+            if(stack == NULL) {
+                valid = 0;
+                continue;
+            }
+            if(now == '}') {
+                if(stack->data == '{') stack = pop(stack);
+                else valid = 0;
+            }
+            else if(now == ')') {
+                if(stack->data == '(') stack = pop(stack);
+                else valid = 0;
+            }
+        }
+        ++idx;
+    }
+
+    if(valid && stack==NULL) {
+        printf("Expression valid\n");
+    }
+    else {
+        if(stack != NULL) {
+            stack = erase(stack);
+        }
+        printf("Expression invalid\n");
+    }
+
+    return 0;
+}
\ No newline at end of file
-- 
GitLab