• 括号匹配问题:判断括号式子是否匹配。如{[()]}是匹配的,而{[[])}是不匹配的。


    //链栈实现
    //问题:判断括号式子是否匹配。如{[()]}是匹配的,而{[[])}是不匹配的。
    //思路:将式子依次入栈,入栈之前将要入栈的括号与栈顶元素比较,能凑成一对则栈顶元素出栈,不能则该元素入栈。假如匹配,则最后栈必空
    //为了方便配对,将每个符号编码
    //如"("是-1,")"是1,"["是-2,"]"是2,"{"是-3,"}"是3,这样做对比比较似乎更容易
    #include "stdio.h"
    #include "stdlib.h"
    typedef struct stack{
        int data;
        stack *next;
    }stack;
    void init(stack *&s);
    int isEmpty(stack *s);
    void push(stack *&s,int x);
    int pop(stack *&s);

    //核心算法
    int matching(char exp[],int n){   //参数:字符数组exp,数组长度n
        stack *c;
        int s[n];
        init(c);
        for(int i=0;i<n;i++){   //先把括号变成对应的编码,编码存入编码数组
            if(exp[i]==')') s[i]=1;
            if(exp[i]=='(') s[i]=-1;
            if(exp[i]==']') s[i]=2;
            if(exp[i]=='[') s[i]=-2;
            if(exp[i]=='}') s[i]=3;
            if(exp[i]=='{') s[i]=-3;
        }
        for(int i=0;i<n;i++){    
            if(isEmpty(c)==1){    //若此时栈空,那就入栈一个元素以便比对
                push(c,s[i]);
            }else{
                if(s[i]==-1*c->next->data){    //如果栈顶元素和将要入栈的元素不等(括号不配对),就进栈
                    pop(c);
                }else{     //如果等(能配对),就出栈
                    push(c,s[i]);
                }
            }
        }
        return isEmpty(c);  //0栈不空,不匹配。1栈空,匹配
    }

    int main(){
        char exp[]={'(',')','(',')','[',']'};
        int n = 6;
        printf("%d",matching(exp,n));
        getchar();
        return 0;
    }

    //注:在考试的时候直接调用函数就好了。最多写个头文件
    void init(stack *&s){     //栈初始化
        s = (stack *)malloc(sizeof(stack));
        s->next = NULL;
    }

    int isEmpty(stack *s){   //栈判空。栈空(栈链表只有头节点)1,不空0
        if (s->next == NULL){
            return 1;
        }else{
            return 0;
        } 
    }

    void push(stack *&s,int x){    //进栈
        stack *p=(stack *)malloc(sizeof(stack));
        p->next = NULL;
        p->data = x;
        p->next = s->next;
        s->next = p;
    }

    int pop(stack *&s){   //出栈
        stack *p;
        if(isEmpty(s) == 1) return 0;   //栈空,无法出栈
        p = s->next;
        //x = p->data;
        s->next = p->next;
        free(p);
        return 1;
    }


  • 相关阅读:
    触发器
    突然的感慨
    最近接手一个asp老项目,运行了4,5年了
    导出sql语句相关问题
    PHP入门速成
    统一项目时间格式(DateTime.ParseExact使用)
    想法太多了就是三脚猫。
    个人习惯培养计划(转):以此为诫,努力提高自身素质。
    excel处理函数打包
    ASP.Net MVC探索之路 增加字符串长度范围校验Attribute
  • 原文地址:https://www.cnblogs.com/BreezeFeng/p/13986967.html
Copyright © 2020-2023  润新知