Match.h
#ifndef AAA
#define AAA
#include<assert.h>
#include<stdio.h>
typedef char DataType;
#define NUMBER 20
typedef struct Stack
{
DataType a[NUMBER];
int count;
}Stack;
void MathBrackets(Stack *cur, char *a);
void StackInit(Stack *ret);
#endif //AAA
Match.c
#include"Match.h"
//栈的初始化
void StackInit(Stack *ret)
{
assert(ret);
ret->count = 0;
}
//判断是否是括号
int IsMatch(char a)
{
if(a == ')' || a == '(' || a == '[' || a == ']' || a == '{' || a == '}')
{
return 1;
}
return 0;
}
//判断左右括号是否匹配
int Match(Stack *cur, char a)
{
assert(cur);
if( (cur)->a[(cur)->count-1] == '(' && a == ')' || (cur)->a[(cur)->count-1] == '[' && a == ']' || (cur)->a[(cur)->count-1] == '{' && a == '}')
{
return 1;
}
return 0;
}
//出栈
void StackPop(Stack **cur)
{
assert(cur);
if((*cur)->count == 0)
{
printf("栈空了\n");
return ;
}
(*cur)->count--;
}
//清空栈
void StackEmpty(Stack **cur)
{
assert(cur);
(*cur)->count = 0;
}
//括号匹配函数
void MathBrackets(Stack *cur, char *a)
{
int i = 0;
assert(cur);
while(a[i])
{
if(IsMatch(a[i]))
{
//遇到左括号时,入栈
if(a[i] == '(' || a[i] == '{' || a[i] == '[')
{
cur->a[cur->count] = a[i];
cur->count++;
}
//遇到右括号时,与栈顶元素比较
if(a[i] == ')' || a[i] == '}' || a[i] == ']')
{
if(cur->count == 0)
{
printf("右括号多于左括号\n");
StackEmpty(&cur);
return ;
}
//如果括号匹配,出栈
else if(Match(cur, a[i]))
{
StackPop(&cur);
}
//如果左右括号不匹配
else
{
printf("括号次序不匹配\n");
StackEmpty(&cur);
return ;
}
}
}
i++;
}
if(cur->count == 0 && a[i] == '\0')
printf("括号匹配\n");
else
printf("左括号大于右括号\n");
StackEmpty(&cur);
}
主函数.c
#include"Match.h"
void Text()
{
Stack ret;
char a[] = "(())abc{[)])}";
char b[] = "(()))abc{[]}";
char c[] = "(()()abc{[]}";
char d[] = "(())abc{[]()}";
StackInit(&ret);
MathBrackets(&ret, a);
MathBrackets(&ret, b);
MathBrackets(&ret, c);
MathBrackets(&ret, d);
}
int main()
{
Text();
return 0;
}