栈在括号匹配中的应用
使用栈来检查一个字符串中的括号是否匹配。
-
栈的定义与初始化:
typedef struct { char data[MaxSize]; int top; // 栈顶指针 } SqStack;
这里定义了一个顺序栈结构体
SqStack
,包括一个字符数组data
作为栈的存储空间,以及一个整型变量top
用来指示栈顶元素的位置。 -
括号匹配函数
bracketCheck
:- 函数原型:
bool bracketCheck(char str[], int length)
- 参数
str
是待检查的字符串数组,length
是字符串的长度。 - 函数逻辑:
- 初始化一个空栈
S
。 - 遍历字符串
str
中的每个字符:- 如果是左括号
'('
、'['
或{
,则入栈。 - 如果是右括号
')'
、']'
或}
,则与栈顶元素比较:- 若栈为空或栈顶元素不匹配,则返回
false
。 - 若匹配,则将栈顶元素出栈。
- 若栈为空或栈顶元素不匹配,则返回
- 如果是左括号
- 最后检查栈是否为空,如果为空则返回
true
,表示所有括号都匹配;否则返回false
。
- 初始化一个空栈
- 函数原型:
-
主函数
main
:
调用bracketCheck
函数并输出结果。 -
注意点:
- 栈满条件的判断:在入栈操作前,应该先判断栈是否已满,避免数组越界。
- 返回值的处理:在遇到不匹配的情况下,可以及时返回
false
,避免继续执行无效的比较操作。 - 测试与错误处理:主函数需要补充测试用例,覆盖不同情况下的括号匹配与不匹配情况。
-
完整的
main
函数示例:#include <stdio.h> #include <stdbool.h> // 定义栈容量 #define MaxSize 10 typedef struct { char data[MaxSize]; int top; } SqStack; bool bracketCheck(char str[], int length) { SqStack S; S.top = -1; for (int i = 0; i < length; i++) { if (str[i] == '(' || str[i] == '[' || str[i] == '{') { // 入栈操作,需先检查栈是否已满 if (S.top == MaxSize - 1) return false; S.data[++S.top] = str[i]; } else { // 右括号,与栈顶元素比较 if (S.top == -1 || (str[i] == ')' && S.data[S.top] != '(') || (str[i] == ']' && S.data[S.top] != '[') || (str[i] == '}' && S.data[S.top] != '{')) { return false; } S.top--; // 出栈 } } // 检查是否还有剩余未匹配的左括号 if (S.top == -1) return true; else return false; } int main() { char testStr1[] = "((()))"; // 匹配 char testStr2[] = "([{}])"; // 匹配 char testStr3[] = "([)]"; // 不匹配 char testStr4[] = "((("; // 不匹配 printf("%s: %s\n", testStr1, bracketCheck(testStr1, sizeof(testStr1)-1) ? "匹配" : "不匹配"); printf("%s: %s\n", testStr2, bracketCheck(testStr2, sizeof(testStr2)-1) ? "匹配" : "不匹配"); printf("%s: %s\n", testStr3, bracketCheck(testStr3, sizeof(testStr3)-1) ? "匹配" : "不匹配"); printf("%s: %s\n", testStr4, bracketCheck(testStr4, sizeof(testStr4)-1) ? "匹配" : "不匹配"); return 0; }
-
流程图(由王道给出https://www.bilibili.com/video/BV1b7411N798?p=27&vd_source=f26c509efd4cb535732504aa1c7d66b2)