括号匹配
判断出入的三种括号“()”、“[]”和“{}”是否匹配
核心思想:可以用栈来解决。在做括号匹配时,如果以左侧符号为标准,左侧符号需要右侧符号来完成匹配,但是由于诸如括号这类的符号可以做嵌套,所以左侧符号之后既能有左侧符号,也能有右侧符号,处理起来很麻烦。但是以右侧符号为标准就没有这个问题了,每一个右侧符号都需要一个左侧符号来匹配,并且要求该右侧符号之前最近的一个符号必须是相匹配的左侧符号,这样处理起来就方便多了。定义一个栈,用以记录遍历到当前位置时,在遍历字符串时,若遇到的是右侧符号,那它需要一个该位置之前最近的一个符号为左侧符号,否则不匹配。若遇到的是左侧符号,压栈,并且当遇到一个右侧符号时,检查栈是否为空,若此时栈不为空,则对栈进行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;
}