括号匹配问题(栈的应用)

栈:
  栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除等操作。
  没有任何元素的栈称为空栈。
  栈又称为 后进先出 的线性表。

括号匹配问题:
  算法思路:
《括号匹配问题(栈的应用)》
  一个关于括号匹配的例子:

《括号匹配问题(栈的应用)》

封装一个静态栈:

#define Max 20
#define DataType char 
typedef struct Stack
{
    DataType data[Max];
    int top;
}stack;

测试函数:

void TestMatchBrackets()
{
    stack s;
    StackInit(&s);
    char a[] = "(())abc{[(])}";
    char b[] = "(()))abc{[]}";
    char c[] = "(()()abc{[]}";
    char d[] = "(())abc{[]()}";
    MatchBrackets(&s, a);
    MatchBrackets(&s, b);
    MatchBrackets(&s, c);
    MatchBrackets(&s, d);
}

括号匹配代码:

void MatchBrackets(stack *s,char arr[])
{
    int i = 0;
    int len = strlen(arr);
    char top;
    //初始化栈
    StackInit(s);
    for (i = 0; i < len; i++)
    {
        //判断是否是括号
        if (IsMatch(arr[i]))
        {
            //判断括号为左括号还是右括号
            if (arr[i] == ')' || arr[i] == '}' || arr[i] == ']')
            {
                //栈为空,右括号多于左括号
                if (EmptyStack(s))
                {
                    printf("右括号多于左括号!\n");
                    return;
                }
                //不为空,取栈顶元素,判断是否匹配
                else
                {
                    top = TopStack(s);
                    if (!((arr[i] == ')'&&top == '(') || (arr[i] == ']'&&top == '[') || (arr[i] == '}'&&top == '{')))
                    {
                        printf("左右括号次序不匹配\n");
                        return;
                    }
                    else
                        PopStack(s);
                }
            }
            else
            {
                //左括号
                PushStack(s, arr[i]);
            }
        }
    }
    if (EmptyStack(s))
    {
        printf("左右括号正确匹配!\n");
        return;
    }
    else
    {
        printf("左括号多于右括号!\n");
        return;
    }
}

栈初始化:

void StackInit(stack *s)
{
    assert(s);
    s->top = 0;
    memset(s->data,0, 20 * sizeof(DataType));
}

判断是否是括号:

int IsMatch(char ch)
{
    if (ch == '(' || ch == ')' || ch == '{' || ch == '}' || ch == '[' || ch == ']')
        return 1;
    else
        return 0;
} 

判断栈空:
  top为0成立,即为占空。

int EmptyStack(stack *s)
{
    assert(s);
    //如果等式成立,返回1
    return s->top == 0;
}

运行展示:

《括号匹配问题(栈的应用)》

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