栈应用之括号匹配问题(C语言版)

来人!!上题目!

一个字符串中有许多的括号! 例如字符串
ptr1[] = “a(()){[[]}]”; //次序
ptr2[] = “a(()){}[[]”; //左多
ptr3[] = “a(()){[[]]}]”; //右多
ptr4[] = “a(()){[[]]}”; //匹配
通过我们的眼睛,我们不难看出这些字符串的括号是否匹配,但是一旦字符串过长,便无法用眼睛了!!
于是乎,用一个函数、一串代码解决这个问题,不是特别煎蛋??

恭迎大人阅读解题思路
《栈应用之括号匹配问题(C语言版)》

小心翼翼给大人递上代码

int Bracket(char ch)
{
    if ('(' == ch || ')' == ch ||                         //判断该字符是否是括号字符
        '[' == ch || ']' == ch ||
        '{' == ch || '}' == ch)
        return 1;
    else
        return 0;
}

//用栈检测括号是否匹配
void MatchBrackets(char* Ptr)
{
    assert(Ptr);                                                                 //参数检测

int size = strlen(Ptr);                                                      //求字符串长度
int i = 0;
StackD s;                                                                    //创建栈

StackDInit(&s, size);                                                        //栈初始化,容量为size

if (size == 0)                                                             //字符串为空
{
    printf("无括号,匹配!! \n");
    return;
}
else                                                                         //字符串不为空
{
    for (; i < size; i++)                                                    //从头开始一次判断 每个字符
    { 
        if (Bracket(Ptr[i]))                                                 //对字符进行判断,看其是否为括号字符
        {
            if ('(' == Ptr[i] || '[' == Ptr[i] || '{' == Ptr[i])             //字符为左边括号  入栈
                StackDPush(&s, Ptr[i]);
            else                                                             //字符是右边括号
            {
                if (StackDSize(&s) == 0)                                     //栈中没有左边括号,则说明右边括号多
                {
                    printf("右边括号比左边括号多!!\n");
                    return;
                }
                else{                                                       //栈中有左边括号,判断是否匹配?  匹配则出栈一次,不匹配则说明括号次序不匹配!
                    char ch = StackDTop(&s);
                    if (ch == '(' && Ptr[i] == ')' ||
                        ch == '[' && Ptr[i] == ']' ||
                        ch == '{' && Ptr[i] == '}')
                        StackDPop(&s);
                    else
                    {
                        printf("括号次序不匹配 !!!\n");
                        return;
                    }
                }
            }
        }
    }
    if (StackDSize(&s) != 0)                                               //判断完所有字符之后,判断栈中是否还有左边括号!
    {
        printf("左边括号比右边括号多!!\n");
        return;
    }
}
printf("括号匹配!!\n");
}

证据在此!!!
《栈应用之括号匹配问题(C语言版)》

提醒:该函数调用了栈结构,关于栈结构的基本操作可以点这个链接
https://blog.csdn.net/code_zx/article/details/80812635
或者关注我,进主页查看哦

《栈应用之括号匹配问题(C语言版)》

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/Code_ZX/article/details/80812950
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞