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