算法题-括号匹配检验

838 阅读2分钟

括号匹配检验:

假设表达式中允许包括两种括号:圆括号与方括号,其嵌套顺序随意,即()或者[([][])]都是正确的。而这[(]或者(()])或者([())都是不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。例如,考虑一下括号的判断:[([][])]

已知条件解析

  1. 只有两种括号 ()和[]这两种
  2. 同一种括号要成对出现
  3. “期待的急迫程度”的意思就是要有优先级关系,后出现的左括号"("和"[",要优先于先出现的左括号

解决方式

  • 用栈先进后出的方式来解决
  • 如果是左括号类型"("和"["就入栈
  • 如果是右括号类型")"和"]",判断是否和栈顶元素类型匹配,如果不匹配直接返回

代码

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;
typedef char ElemType;

typedef struct linkList{
    ElemType data;
    struct linkList *next;
}LinkList, *LinklistPtr;

typedef struct BracketsStack{
    LinklistPtr top;
    int count;
}BracketsStack;

Status initBracketsStack(BracketsStack *bStack) {
    bStack->top = NULL;
    bStack->count = 0;
    return OK;
}

Status isStackEmpty(BracketsStack bStack) {
    if (bStack.count == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

Status getBracketsStackTopElem(BracketsStack bStatck, ElemType *elem) {
    if (isStackEmpty(bStatck)) {
        return ERROR;
    } else {
        *elem = bStatck.top->data;
        return OK;
    }
}

Status pushData2BracketsStack(BracketsStack *bStack, ElemType elem) {
    LinklistPtr temp = (LinklistPtr)malloc(sizeof(LinkList));
    temp->data = elem;
    temp->next = bStack->top;
    bStack->top = temp;
    bStack->count ++;
    return OK;
}

Status popDataFromBracketsStack(BracketsStack *bStack, ElemType *elem) {
    LinklistPtr temp = bStack->top;
    *elem = temp->data;
    bStack->top = temp->next;
    free(temp);
    bStack->count--;
    return OK;
}

Status checkBrackets(char *brackets){
    BracketsStack bs;
    initBracketsStack(&bs);
    
    char *p = brackets;
    while (*p) {
        if (*p == '(' || *p == '[') {
            printf("push %c\n", *p);
            pushData2BracketsStack(&bs, *p);
        } else {
            ElemType topElem;
            Status iStatus = getBracketsStackTopElem(bs, &topElem);
            if (iStatus) {
                ElemType elem;
                if (*p == ')' && topElem == '(') {
                    popDataFromBracketsStack(&bs, &elem);
                    printf("pop %c-%c\n", *p, elem);
                } else if (*p == ']' && topElem == '[') {
                    popDataFromBracketsStack(&bs, &elem);
                    printf("pop %c-%c\n", *p, elem);
                } else {
                    return ERROR;
                }
            } else {
                return ERROR;
            }
        }
        p++;
    }
    
    if (isStackEmpty(bs)) {
        return OK;
    } else {
        return ERROR;
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    
    if (checkBrackets("[([][])]")) {
        printf("括号匹配\n");
    } else {
        printf("括号不匹配\n");
    };
    
    if (checkBrackets("[(]")) {
        printf("括号匹配\n");
    } else {
        printf("括号不匹配\n");
    };
    
    return 0;
}

运行

传送门

算法题-每日气温