#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define Maxsize 10
//用链栈
typedef struct LinkNode{
char data; // 数据域
struct LinkNode* next; //指针域
int num;//栈中元素个数
}LinkNode;
typedef struct{
LinkNode* rear;
}LinkStack;
//初始化链栈 带头指针
bool InitStack(LinkStack *L){
L->rear = L->front = (LinkNode*) malloc(sizeof(LinkNode));//使shou
L->rear->next = NULL;//c语言中的null一定要大写
L->rear->num = 0;
return true;
}
//判断是否为空栈
bool StackEmpty(LinkStack *L){
return L->rear->num==0;
}
//进栈
bool Push(LinkStack *L,char str){
// LinkNode* s =(LinkNode*)malloc(sizeof(LinkNode));//建立新结点
LinkNode* s = (LinkNode*) malloc(sizeof(LinkNode));
s->data = str;
s->next = NULL;
L->rear->next = s;//链接尾节点
L->rear = s;//使尾指针指向新的尾节点
L->rear->num++;//栈中元素加一
return true;
}
//出栈
bool Pop(LinkStack *L,char * top){
if(L->rear->num==0){return false;}
*top = L->rear->data;//返回尾节点的元素
//寻找最后第二个节点
LinkNode *p = L->front;//指针p指向头节点
int i = L->rear->num;//当前栈中元素数量
int j = 0;
while(p!=NULL&& j < i -1){
p = p->next;
j++ ; //
}
if(p==NULL){return false ; }
LinkNode *q = L->rear;//新指针指向尾节点
L->rear->num--;//栈中元素数量减一
L->rear = p;//尾指针指向倒数第二个节点
p->next = NULL;
free(q);//释放尾节点
return true;
}
bool match(char str[]){
LinkStack L;//声明一个结构体
InitStack(&L);//初始化结构体
for(int i = 0 ; i < Maxsize ; i++){
if(str[i]=='('||str[i]=='['||str[i]=='{'){
Push(&L,str[i]);//进栈
}else{
char top;
Pop(&L ,&top);
if(str[i]=='('&& top!=')'){ return false;}
if(str[i]=='['&& top!=']'){ return false;}
if(str[i]=='{'&& top!='}'){ return false;}
}
}
return StackEmpty(&L);
}
int main()
{
char str[Maxsize] = {'(','(',')','{','}','[',']',')','{','}'};
if(match(str)){
printf("匹配成功");
}else{
printf("匹配不成功");
}
return 0;
}