数据结构 栈 括号匹配问题

1.题目:
a."(())abc{[(])}";
b."(()))abc{[]}";
c."(()()abc{[]}";
d."(())abc{[]()}";
2.整体思路

这里写图片描述

以第一个为例:
这里写图片描述

3.程序代码
//Stack.h
#ifndef __STACK_H__
#define __STACK_H__

#include <stdio.h>
#include <Windows.h>
#include <assert.h>

#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.执行结果

这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值