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

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


posted @ 2020-11-16 20:22  封不烦  阅读(299)  评论(0编辑  收藏  举报