使用C语言实现括号配对功能的代码分析

摘要:本篇博客将深入分析一段使用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能够更好地理解和应用括号配对问题的解决方案,在实际开发中能够编写出稳健、高效的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值