前言
上次我们已经介绍了栈的思想对于逆波兰表达式实现四则运算计算器的应用,这次我们将介绍一个更加经典的栈有关问题——括号匹配。
这两次有关栈的代码均已上传到gitee的the stack文件中,欢迎自取: 濡白的学习小仓库
目录
觉得对你有帮助的话记得三连哦~
基本思路
这次的问题相对于上次的计算器更加简单,实际上我们只要简单了解其原理,基本都可以自主实现出来。
首先我们先对括号匹配问题进行简单的分析:
QUESTIONS:
1.怎样才算括号匹配?
2.如何表示上述的括号匹配?
3.怎么用栈的思想来进行表述?
ANSWERS:
1.对于每一个括号都有与之对应的反括号,即括号集长度必定为偶数,且括号正反顺序正确;
2.从头开始遍历字符串,记录出现的左括号数量和右括号数量,左括号数量恒大于等于右括号数量;
3.将左括号放入栈内,遇到右括号则一个左括号出栈,遇到右括号时,栈内必不为空;
代码实现
#include<stdio.h>
#include<string.h>
#define my_MAX 100
int isValid(char*);
//int main()
//{
// char s[my_MAX] = { 0 };
// scanf("%s", s); // 输入一个字符串
// int i = isValid(s);
// printf("%d", i);
// return 0;
//}
int isValid(char* s)
{
if (strlen(s) % 2) // 括号是成对出现的,如果字符数量不是双数,说明至少有一个括号不匹配,直接返回
return 0;
int m = -1, n = 0;
char a[10000] = { 0 }; // 模拟一个空栈来存放括号
while (s[n]) // 循环直到s到末尾\0
{
if (s[n] == '(' || s[n] == '[' || s[n] == '{') // 如果是左括号则入栈
a[++m] = s[n];
else if (a[0] != 0 && (s[n] == ')' || s[n] == ']' || s[n] == '}')) // 如果此时不是空栈,即至少存在一个左括号时,才进行下一步判断
{
if ((int)a[m] == s[n] - 1 || (int)a[m] == s[n] - 2) // 由ascll码查询可知,三种不同的括号,左右括号都相差 1 - 2
a[m--] = 0; // 此时 m-- ,相当于栈顶下移,进行出栈操作
else
return 0; // 如果不匹配则直接返回
}
else if (a[0] == 0 && (s[n] == ')' || s[n] == ']' || s[n] == '}')) // 若此时是空栈,则右括号无对应匹配的左括号,直接返回
return 0;
n++; // 每次比较一个字符之后,n向后移一个
}
if (a[0] != 0) // 最后如果栈内还有元素未匹配则返回0,反之则返回1
return 0;
return 1;
}