数据结构 栈 括号匹配问题

1.题目:

a."(())abc{[(])}";
b."(()))abc{[]}";
c."(()()abc{[]}";
d."(())abc{[]()}";

2.整体思路

数据结构 栈 括号匹配问题_第1张图片

以第一个为例:
数据结构 栈 括号匹配问题_第2张图片

3.程序代码

//Stack.h
#ifndef __STACK_H__
#define __STACK_H__

#include 
#include 
#include 

#define MAXSIZE 10
//typedef int DataType;

typedef struct StackNode
{
    DataType arr[MAXSIZE];
    int top;
}Stack, *pStack;

void InitStack(pStack ps);
void PushStack(pStack ps, DataType data);
void PopStack(pStack ps);
DataType TopStack(pStack ps);
int SizeStack(pStack ps);
int EmptyStack(pStack ps);

#endif // __STACK_H__
//Stack.c
#include "Stack.h"

//初始化栈
void InitStack(pStack ps)
{
    assert(ps);

    ps->top = 0;
}
//压栈
void PushStack(pStack ps, DataType data)
{
    assert(ps);

    ps->arr[ps->top++] = data;
}
//出栈
void PopStack(pStack ps)
{
    assert(ps);

    ps->top--;
}
//求出栈顶的元素
DataType TopStack(pStack ps)
{
    assert(ps);

    return ps->arr[ps->top - 1];
}
//求出栈中元素的个数
int SizeStack(pStack ps)
{
    assert(ps);

    return ps->top;
}
//求栈是否为空
int EmptyStack(pStack ps)
{
    assert(ps);

    return 0 == ps->top;
}
//test.c
#include "Stack.h"

void MatchBrackets(const char *p)
{
    Stack s;
    InitStack(&s);

    while (*p)
    {
        //检测该字符是否为左括号,若果是就压栈
        if (('(' == *p) || ('[' == *p) || ('{' == *p))
        {
            PushStack(&s, *p);
        }//检测该字符是否为右括号
        else if ((')' == *p) || (']' == *p) || ('}' == *p))
        {
            //若此时栈中为空的,说明没有左括号与之匹配,右括号多了
            if (EmptyStack(&s))
            {
                printf("右括号比左括号多!!\n");
                return;
            }
            //检测左右括号是否匹配,若匹配则相应的左括号出栈
            if (!(('(' == TopStack(&s) && ')' == *p) ||
                ('[' == TopStack(&s) && ']' == *p) ||
                ('{' == TopStack(&s) && '}' == *p)))
            {
                printf("左右括号不匹配!!!\n");
                return;
            }
            PopStack(&s);
        }
        p++;
    }
    //结束循环且没有返回,说明检测了所有的字符
    //此时检测栈中是否为空,不为空说明还有多余的左括号
    if (SizeStack(&s) != 0)
    {
        printf("左括号比右括号多!!!\n");
        return;
    }

    printf("括号匹配正确!!!\n");
}

int main()
{
    char a[] = "(())abc{[(])}";
    char b[] = "(()))abc{[]}";
    char c[] = "(()()abc{[]}";
    char d[] = "(())abc{[]()}";

    MatchBrackets(a);
    MatchBrackets(b);
    MatchBrackets(c);
    MatchBrackets(d);

    system("pause");
    return 0;
}

4.执行结果

数据结构 栈 括号匹配问题_第3张图片

你可能感兴趣的:(数据结构)