括号匹配

括号匹配

判断出入的三种括号“()”、“[]”和“{}”是否匹配

核心思想:可以用栈来解决。在做括号匹配时,如果以左侧符号为标准,左侧符号需要右侧符号来完成匹配,但是由于诸如括号这类的符号可以做嵌套,所以左侧符号之后既能有左侧符号,也能有右侧符号,处理起来很麻烦。但是以右侧符号为标准就没有这个问题了,每一个右侧符号都需要一个左侧符号来匹配,并且要求该右侧符号之前最近的一个符号必须是相匹配的左侧符号,这样处理起来就方便多了。定义一个栈,用以记录遍历到当前位置时,在遍历字符串时,若遇到的是右侧符号,那它需要一个该位置之前最近的一个符号为左侧符号,否则不匹配。若遇到的是左侧符号,压栈,并且当遇到一个右侧符号时,检查栈是否为空,若此时栈不为空,则对栈进行pop操作表明顶部元素已被匹配,否则为不匹配情况。当整个字符串遍历结束,我们就可以通过判断该栈是否为空来判断整个字符串中的符号是否匹配。代码如下:

所有头文件

//栈
#pragma once

typedef int Datatype;

typedef struct Stack{
	Datatype arr[100];
	int top;
	char* base;
}Stack;

//括号匹配
#pragma once

typedef enum MatchResult{
	MATCHED,     //匹配
	NOT_MATCHED,	 //左右括号不匹配
	LEFT_MORE,	//左括号多
	RIGHT_MORE		//右括号多
}MR;

所有源代码

//栈
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"Stack.h"


void StackInit(Stack *Sta){
	assert(Sta);
	Sta->base = (char*)malloc(100 * sizeof(char));
	Sta->top = 0;
}

void StackDestroy(Stack* Sta){
	assert(Sta);
	Sta->top = 0;
	free(Sta);
}

void StackPush(Stack* Sta, Datatype data){
	assert(Sta != NULL);
	assert(Sta->top < 100);

	Sta->arr[Sta->top++] = data;
}

void StackPop(Stack* Sta){
	assert(Sta != NULL);
	assert(Sta->top>0);
	Sta->top--;
}

Datatype StackTop(Stack* Sta){
	assert(Sta != NULL);
	assert(Sta->top > 0);
	return Sta->arr[Sta->top - 1];
}

int StackIsEmpty(Stack* Sta){
	assert(Sta != NULL);
	return Sta->top == 0 ? 1 : 0;
}

int StackSize(Stack* Sta){
	assert(Sta != NULL);
	return Sta->top;
}

//括号匹配
#include"MatchBrackets.h"
#include"Stack.h"
#include<string.h>

MR MatchBrackets(const char* str){
	Stack s;
	StackInit(&s);
	int len = strlen(str);
	char ch, lch;
	int i;
	int x = '(' + ')';
	int z = '{' + '}';
	int d = '[' + ']';
	for (i = 0; i < len; i++){
		ch = str[i];
		switch (ch)
		{
		case '{': case '[': case '(':
			StackPush(&s, ch);
			break;
		case '}': case ']': case ')':
		{
					  if (StackIsEmpty(&s)) {
						  return RIGHT_MORE;
					  }
					  lch = Top(&s);
					  StackPop(&s);
					  if ((lch == '('&&ch != ')') || (lch == '['&&ch != ']') || (lch = '{'&&ch != '}'))
						  return NOT_MATCHED;
		}
			break;
		default;
			break;
		}
	}
	if (StackIsEmpty(&s)){
		return MATCHED;
	}
	else{
		return LEFT_MORE;
	}
	StackDestroy(&s);
}










测试代码

#include<stdio.h>
#include"MatchBrackets.h"

void TestMB(const char* s){
	static const char* messages[] = {
		"匹配成功",
		"左右括号不一致",
		"左括号多",
		"右括号多"
	};
	MR result = MatchBrackets(s);
	printf("%s:匹配结果:%s\n", s, messages[result]);
}

int main(){
	TestMB("(())hhh{[]}");
	TestMB("((())hhh{[]}");
	TestMB("(()()hhh{[]}");
	TestMB("(())hhh{[(])}");

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值