思路:

1.括号匹配问题首先想到使用栈数据结构

2.遇到左括号一直压栈保存即可

3.遇到右括号,出栈一个符号ch_t,若ch_t是该右括号对应的左括号则继续;若不是,则将ch_t压回栈中,结束循环。
注1:可能遇到栈为空的情况,即:符号ch_t='\0'。此时不必压栈处理。

4.若最后栈空,说明所有括号成功匹配,输出yes。

5.若栈非空,则输出no,并按照题目要求的格式,输出栈顶元素。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
//栈数据结构
typedef struct StackNode{
    char c[1000];
    int top;
} *Stack;
//判空
bool isEmpty(Stack stack){
    if(stack->top==-1){
        return true;
    }else{
        return false;
    }
}
//初始化
Stack InitStack(){
    Stack stack;
    stack=(Stack)malloc(sizeof(struct StackNode));
    stack->top=-1;
    strcpy(stack->c,"");
    return stack;
}
//压栈
void Push(Stack stack,char ch){
    stack->top++;
    stack->c[stack->top]=ch;
}
//出栈
char Pop(Stack stack){
    if(isEmpty(stack)){
        return '\0';
    }
    char ch=stack->c[stack->top];
    stack->c[stack->top]='\0';
    stack->top--;
    return ch;
}

int main(){
    Stack stack=InitStack();
    char ch,a[1000]={0};
    int i=0;
    while((ch=getchar())!=EOF){
        a[i]=ch;
        i++;
    }
    char t;
    for(i=0;;i++){
        if(a[i-2]=='\n'&&a[i-1]=='.'&&a[i]=='\n'){//终止条件
            break;
        }
        if(a[i]=='('){//左括号
            Push(stack,a[i]);
        }else if(a[i]==')'){
            t=Pop(stack);
            if(t!='('){//右括号
                if(t!='\0'){
                    Push(stack,t);
                }else{
                    Push(stack,a[i]);
                }
                break;
            }
        }else if(a[i]=='/'&&a[i+1]=='*'){
            i++;
            Push(stack,'<');
        }else if(a[i]=='*'&&a[i+1]=='/'){
            i++;
            t=Pop(stack);
            if(t!='<'){
                if(t!='\0'){
                    Push(stack,t);
                }else{
                    Push(stack,'>');
                }
                break;
            }
        }else if(a[i]=='['){
            Push(stack,'[');
        }else if(a[i]==']'){
            t=Pop(stack);
            if(t!='['){
                if(t!='\0'){
                    Push(stack,t);
                }else{
                    Push(stack,a[i]);
                }
                break;
            }
        }else if(a[i]=='{'){
            Push(stack,a[i]);
        }else if(a[i]=='}'){
            t=Pop(stack);
            if(t!='{'){
                if(t!='\0'){
                    Push(stack,t);
                }else{
                    Push(stack,a[i]);
                }
                break;
            }
        }
    }
    if(isEmpty(stack)){//正确匹配
        printf("YES");
    }else{//错误匹配
        printf("NO\n");
        t=Pop(stack);
        if(t=='<'){
            printf("/*-?");
        }else if(t=='>'){
            printf("?-*/");
        }else if(t=='('){
            printf("(-?");
        }else if(t==')'){
            printf("?-)");
        }else if(t=='['){
            printf("[-?");
        }else if(t==']'){
            printf("?-]");
        }else if(t=='{'){
            printf("{-?");
        }else if(t=='}'){
            printf("?-}");
        }
    }
}


最终好结局:

更多推荐