#include <stdio.h>
#include <stdlib.h>

#define SIZE 100
int stack[SIZE]; // store (left_brackets_pos) * 10 + encoded_left_bracket
int top = -1;

// stack functions
int full();
int empty();
void push(int);
int pop();

// self defined
char corresponding_bracket(char);
int encode_left_bracket(char);
char decode_left_bracket(int);

int main() {
    char symb;
    int pos = 0;

    while ((symb = getchar()) != '\n') {
        if (symb == '(' || symb == '[' || symb == '{') {
            int left_bracket_type = encode_left_bracket(symb);
            push(pos * 10 + left_bracket_type); // * NOTICE * tens and higher stands for left_bracket_position; ones stands for left_bracket_type
        } else if (symb == ')' || symb == ']' || symb == '}') {
            char right_bracket = symb; // right_bracket on pos
            if (!empty()) {
                int popped_value = pop(); // encoded_left_bracket on the top of the stack
                int left_bracket_pos = popped_value / 10; // get pos
                char left_bracket = decode_left_bracket(popped_value % 10); // get bracket type
                if ((right_bracket == ')' && left_bracket == '(') ||
                    (right_bracket == ']' && left_bracket == '[') ||
                    (right_bracket == '}' && left_bracket == '{')) { // if paired
                    printf("%c%d,%d%c\n", left_bracket, left_bracket_pos, pos, right_bracket); // print bracket pair position
                } else { // if not paired
                    // push(popped_value);
                    // 位置編號%d的左括弧%c沒有可配對的右括弧%c"
                    // printf("left parenthesis %c at %d has no matching right parenthesis %c\n", left_bracket, pos, corresponding_bracket(left_bracket));
                    printf("right parenthesis %c at %d has no matching left parenthesis %c\n", right_bracket, pos, corresponding_bracket(right_bracket));
                }
            } else { // lack left_bracket
                printf("right parenthesis %c at %d has no matching left parenthesis %c\n", right_bracket, pos, corresponding_bracket(right_bracket));
            }
        }
        pos++;
    }
    while (!empty()) { // 剩餘堆疊裡的左括號都沒有右括號
        int popped_value = pop();
        int left_bracket_pos = popped_value / 10;
        char left_bracket = decode_left_bracket(popped_value % 10);
        printf("left parenthesis %c at %d has no matching right parenthesis %c\n", left_bracket, left_bracket_pos, corresponding_bracket(left_bracket));
    }
    return 0;
}

int full() {
    return top == SIZE - 1;
}

int empty() {
    return top == -1;
}

void push(int c) {
    if (!full()) {
        stack[++top] = c;
    } else {
        printf("Stack is full!\n");
        exit(1); // exit with failure code 1
    }
}

int pop() {
    if (!empty()) {
        int popped_value = stack[top];
        stack[top--] = 0;
        return popped_value;
    } else {
        printf("Stack is empty!\n");
        exit(2); // exit with failure code 2
    }
}

char corresponding_bracket(char bracket) {
    if (bracket == '(') return ')';
    if (bracket == '[') return ']';
    if (bracket == '{') return '}';
    if (bracket == ')') return '(';
    if (bracket == ']') return '[';
    if (bracket == '}') return '{';
    return '\0';
}

int encode_left_bracket(char bracket) {
    if (bracket == '(') return 1;
    if (bracket == '[') return 2;
    if (bracket == '{') return 3;
    return -1;
}

char decode_left_bracket(int encoded_bracket) {
    if (encoded_bracket == 1) return '(';
    if (encoded_bracket == 2) return '[';
    if (encoded_bracket == 3) return '{';
    return '\0';
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: