zoukankan      html  css  js  c++  java
  • 括号匹配问题:判断括号式子是否匹配。如{[()]}是匹配的,而{[[])}是不匹配的。

    //链栈实现
    //问题:判断括号式子是否匹配。如{[()]}是匹配的,而{[[])}是不匹配的。
    //思路:将式子依次入栈,入栈之前将要入栈的括号与栈顶元素比较,能凑成一对则栈顶元素出栈,不能则该元素入栈。假如匹配,则最后栈必空
    //为了方便配对,将每个符号编码
    //如"("是-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;
    }


  • 相关阅读:
    迷茫 分类: 工作生活经历 20081221 00:46 139人阅读 评论(0) 收藏
    舍得 分类: 工作生活经历 20090614 12:52 142人阅读 评论(0) 收藏
    计算机体系结构 分类: 工作生活经历 20090614 13:01 143人阅读 评论(0) 收藏
    状态不佳 20090115 00:24 150人阅读 评论(0) 收藏
    数字电路 分类: 工作生活经历 20090210 23:18 178人阅读 评论(0) 收藏
    About
    最终还是用了wordpress 你好wordpress
    oa项目 发送提示消息接口
    php获取文件后缀函数
    世界,你好!
  • 原文地址:https://www.cnblogs.com/BreezeFeng/p/13986967.html
Copyright © 2011-2022 走看看