摘要:本篇博客将深入分析一段使用C语言实现括号配对功能的代码。我们将介绍代码中的数据结构、关键函数以及其工作原理。通过详细的代码分析,读者将了解如何使用栈来实现括号匹配,以及如何处理括号配对失败的情况,从而更好地理解和应用这一常见的编程问题的解决方案。
#include <stdio.h>
#include <string.h>
// 定义栈结构和相关操作
#define MAX_SIZE 100
typedef struct {
char data[MAX_SIZE];
int top;
} Stack;
void initStack(Stack *stack) {
stack->top = -1;
}
void push(Stack *stack, char c) {
stack->data[++stack->top] = c;
}
char pop(Stack *stack) {
if (stack->top == -1) {
return '\0'; // 栈为空,返回空字符
}
return stack->data[stack->top--];
}
int isEmpty(Stack *stack) {
return (stack->top == -1);
}
// 判断括号是否匹配
int isMatchingPair(char opening, char closing) {
if (opening == '(' && closing == ')') {
return 1;
}
if (opening == '[' && closing == ']') {
return 1;
}
return 0;
}
// 对括号进行配对
void balanceBrackets(char *s) {
int len = strlen(s);
Stack stack;
initStack(&stack);
for (int i = 0; i < len; i++) {
if (s[i] == '(' || s[i] == '[') {
push(&stack, s[i]); // 遇到左括号,压入栈
} else if (s[i] == ')' || s[i] == ']') {
char topChar = pop(&stack);
if (!isMatchingPair(topChar, s[i])) {
// 配对失败,需要添加字符使其匹配
printf("%c%c", topChar, s[i]);
}
}
}
// 未配对的左括号需要添加配对字符
while (!isEmpty(&stack)) {
char topChar = pop(&stack);
char matchingChar = (topChar == '(') ? ')' : ']';
printf("%c%c", topChar, matchingChar);
}
}
int main() {
char s[] = "([()]"; // 待配对的字符串
balanceBrackets(s);
return 0;
}
代码中首先包含了两个标准头文件 `<stdio.h>` 和 `<string.h>`,分别用于输入输出操作和字符串处理操作。
接下来,我们定义了用于存储字符的栈数据结构。栈是一种后进先出(LIFO)的数据结构,在这里用于存储待配对的括号字符。栈的大小通过宏定义 `MAX_SIZE` 设置为100,并定义了一个 `Stack` 结构体,其中包含一个字符数组 `data` 用于存储数据,以及一个整型变量 `top` 用于记录栈顶的位置。另外,代码提供了几个操作栈的函数:`initStack` 用于初始化栈,`push` 用于将字符压入栈,`pop` 用于将字符从栈顶弹出,`isEmpty` 用于判断栈是否为空。
接下来是一个用于判断括号是否匹配的函数 `isMatchingPair`。该函数接受两个字符作为参数,判断它们是否是括号的配对关系,并返回一个整型值。如果两个字符是左括号和右括号的配对关系,则返回1;否则返回0。
然后,我们来到核心函数 `balanceBrackets`,该函数用于对字符串中的括号进行配对检查和修正。函数接受一个字符串参数 `s`,并依次遍历字符串中的字符。如果遇到左括号(`(` 或 `[`),则将其压入栈中。如果遇到右括号(`)` 或 `]`),则弹出栈顶的字符,并与当前字符进行配对检查。如果两个字符不是配对关系,则输出需要添加的字符使其匹配。遍历结束后,还需检查栈中是否还有未配对的左括号,对于每个未配对的左括号,输出需要添加的配对字符。
最后,在 `main` 函数中定义了一个字符串 `s`,用于存储待配对的括号序列。然后调用 `balanceBrackets` 函数对该字符串进行括号配对检查和修正。
通过这段代码,我们实现了一个简单而强大的括号配对功能。它能够快速检查一个字符串中的括号是否配对,并输出需要添加的字符使其配对。这对于括号匹配的应用场景,如括号匹配的验证、语法分析等,提供了很大的便利。
希望通过这篇博客,各位码u能够更好地理解和应用括号配对问题的解决方案,在实际开发中能够编写出稳健、高效的代码。