简单算法——使用栈实现括号匹配检验

设计一个算法判定一个算术表达式中的括号是否正确配对(包括三种括号并且需要考虑大中小三种括号的嵌套顺序), 并将对应的程序调试运行通过。

算法思想:

暂不考虑数据元素的运算,只考虑括号的配对。则有两个概念:对右括号期待的急迫程度和当前括号的优先级。因此前者的特点符合栈的特点,即后遍历到的括号,急迫程度越强。因此使用一个栈来存储遍历到的括号,遇到左括号则入栈,遇到右括号,如果匹配当前左括号则出栈,如果不匹配则跳出报错,如果出现了有右括号无左括号或遍历完成不是空栈的情况,则跳出报错。
第二个概念则使用一个变量来表示优先级,每做一次入栈或出栈的操作,则检查一下当前栈顶元素的优先级来确定当前括号的优先级,如果入栈的左括号优先级低于当前等级,则跳出报错。

C语言代码实现:

//使用栈实现括号的匹配 
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

//定义一个栈
typedef struct Stack{
    char *top;
    char *bottom;
    int size;
}Stack,*PStack;

void initStack(PStack x,int s){
    x->size=s;
    x->bottom=(char*)malloc(sizeof(char)*(s+1));
    if(!x->bottom)
        exit(0);
    x->top=x->bottom;
}

int judgeEmpty(PStack x){
    if(x->bottom==x->top)
        return 1;
    return 0;
}

int judgeFilled(PStack x){
    if(x->bottom-x->top==x->size)
        return 1;
    return 0;
}

int push(PStack x,char in){
    if(judgeFilled(x)==1)
        return 1;
    *(x->top)=in;
    x->top++;
    return 0;
}

int pop(PStack x){
    if(judgeEmpty(x)==1)
        return 1;
    --(x->top);
    return 0;
} 

int bracketMatch(char *x){
    PStack stack=(PStack)malloc(sizeof(Stack));
    initStack(stack,50);
    int i=0,level=-1;

    while(x[i]!='\0'&&judgeFilled(stack)==0){
        switch(x[i])
        {
            case '(':
                push(stack,'(');
                level=2;
                break;
            case '[':
                if(level>1)
                    return 0;
                level=1;
                push(stack,'[');
                break;
            case '{':
                if(level>0)
                    return 0;
                level=0;
                push(stack,'{');
                break;
            case ')':
                if(judgeEmpty(stack)==1||*(stack->top-1)!='(')
                    return 0;
                pop(stack);
                switch(*stack->top-1)
                {
                    case '(':
                        level=2;
                        break;
                    case '[':
                        level=1;
                        break;
                    case '{':
                        level=0;
                        break;
                }
                break;
            case ']':
                if(judgeEmpty(stack)==1||*(stack->top-1)!='[')
                    return 0;
                pop(stack);
                switch(*stack->top-1)
                {
                    case '(':
                        level=2;
                        break;
                    case '[':
                        level=1;
                        break;
                    case '{':
                        level=0;
                        break;
                }
                break;
            case '}':
                if(judgeEmpty(stack)==1||*(stack->top-1)!='{')
                    return 0;
                pop(stack);
                switch(*stack->top-1)
                {
                    case '(':
                        level=2;
                        break;
                    case '[':
                        level=1;
                        break;
                    case '{':
                        level=0;
                        break;
                }
                break;
            default:
                printf("o\n");
                break;
        }
        i++;
    }
    if(judgeEmpty(stack)==0)
        return 0;

    free(stack);
    return 1;
}

int main(){
    printf("请输入表达式:");
    char c[50];
    scanf("%s",c);

    if(bracketMatch(c)==1)
        printf("YES!\n");
    else
        printf("NO!\n");

    return 0;
}
    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/Panda23333/article/details/78222866
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞