我们在编写程序的时候经常会遇到括号不匹配而导致语法错误的问题,现在我们可以通过栈来自己实现括号匹配的问题,了解其实现细节。
我们假设在表达式中只有()[]这两种括号,其嵌套的方式是随意的。检验括号是否匹配可以用“期待的急迫程度”这个概念来描述(其实就是优先级的意思)。
使用栈的方式进行匹配可以很好的执行这个解决过程:
1,遍历字符串,如果遇到'(' 或者是'['则进行入栈操作,过滤掉其他字符
2,如果遇到')'或是‘]’,则与栈顶元素进行判断,看是否匹配'('与‘)’匹配,
‘[’与']'匹配。如果匹配成功,则出栈(注意这里并没有将‘)’或']'压入栈中。
如果匹配失败,则可直接返回错误信息。
3,当循环遍历结束时查看栈顶指针top是否为0(两两匹配的话就会最终结果就为0了),否则返回错误信息。
以下是具体的代码实现:
#define TRUE 1
#define FALSE 0
typedef int Status;
/**-- 字符匹配,str为需要判断是否匹配成功的字符串 --*/
Status bracketMatch(char* str) {
char stack[128]; //用数组模拟栈
int top = 0; //栈顶指针
int i = 0;
while(str[i] != '\0') {
if (str[i] == '(' || str[i] == '[') {
stack[top++] = str[i];
} else if (str[i] == ')' || str[i] == ']' ) {
if (stack[top - 1] == str[i] - 1) { //这里根据ASCII码进行匹配的判断‘(’与‘)’的值差1
top--;
} else if (stack[top - 1] == str[i] - 2) {//这里根据ASCII码进行匹配的判断‘[’与‘]’的值差2
top--; //匹配成功出栈
} else
return FALSE; //失败即可立即返回
}
i++;
}
//最后判断top是否为0
return top == 0 ? TRUE : FALSE;
}
int main() {
char str[128];
scanf("%s",str);
getchar();
if (bracketMatch(str)) {
printf("匹配成功!");
} else {
printf("匹配失败!");
}
return 0;
}
以下是测试结果: