1.原理步骤
- 从头开始扫描字符串,如果是左括号,入栈
- 如果是右括号,检查栈是否为空,如果为空,说明没有左括号与当前的右括号相匹配。如果栈不为空且栈顶元素与当前符号相匹配,继续检查下一元素
- 重复以上过程,直至扫描完最后一个元素
- 检查栈是否为空,如果不为空,说明栈中还存有左括号没有与之对应的右括号相匹配。如果为空,说明匹配成功
2.代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MaxSize 50
typedef struct {
char data[MaxSize];
int top;
}SqStack;
void initStack(SqStack& S) {
S.top = -1;
}
bool pushStack(SqStack& S, char& x) {
if (S.top > MaxSize - 1) {
return false;
}
S.top++;
S.data[S.top] = x;
return true;
}
bool popStack(SqStack& S,char &x){
if (S.top == -1) {
return false;
}
x = S.data[S.top];
S.top--;
return true;
}
bool isEmpty(SqStack& S) {
if (S.top == -1) {
return true;
}
return false;
}
char getTopEle(SqStack S) {
return S.data[S.top];
}
//括号匹配函数
bool parenMatch(char pa[],int length) {
SqStack S;
initStack(S);
for (int i = 0; i < length; i++) {
if (!pa[i])
break;
if (pa[i] == '(' || pa[i] == '[' || pa[i] == '{') { //如果是左括号全部入栈
pushStack(S, pa[i]);
}
else {
if (isEmpty(S)) { //如果是右括号,但是栈中没有符号,return false
return false;
}
if ( pa[i] == ')' && getTopEle(S) == '(') {
popStack(S, S.data[S.top]);
}
if (pa[i] == ']' &&getTopEle(S) == '[') {
popStack(S, S.data[S.top]);
}
if (pa[i] == '}' && getTopEle(S) == '{') {
popStack(S, S.data[S.top]);
}
}
}
return isEmpty(S); //全部匹配成功后,如果栈中含有符号,则说明输入的符号不能成对匹配
}
int main() {
char pa[50];
printf("输入你想要匹配的符号(不能超过50),如{ [ ( ) } ]:");
scanf("%s", &pa);
int length = sizeof(pa) / sizeof(char);
bool res=parenMatch(pa, length);
if (res) {
printf("匹配成功!");
}
else {
printf("匹配失败!");
}
}
3.测试
成功:
失败: