括号匹配问题

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值