括号匹配

用C语言实现括号匹配,表达式中只有()[]{}六种字符。

大概思路:使用两个数组作为栈,分为左边栈和右边栈,每次从左边移动一个字符到右边,然后匹配两个栈的栈顶的符号匹不匹配,若匹配则消去这一对括号后再接着操作(继续消去括号或着继续入栈,或匹配成功),若不匹配则继续入栈。

同时在入栈之前、入栈之后、匹配之前的每一步操作中都要判断两个栈的内容的合理性,如果左边栈为空,右边栈不为空,则说明有错误,或者右边栈出现( [ {这三种符号,也说明表达式有错误。最后,当左右两边的栈同时为空时,则说明匹配成功。


下面是源代码:

#include <stdio.h>
#include <string.h>
#define N 100

char a[] = "(((([][][][][][{{[[()()]]}{}}{}]))))((()))()()()({}{[[]]})(())";
char s[N] = {'0'};
int top;
int sp;

int match(char f)
{
    if(a[top] == f)//匹配一对括号
    {
        if(top > 0)//左边未匹配完
        {
            top--;

            if(sp > 0)//右边未匹配完,继续匹配
                sp--;
            else    ///右边匹配完
            {
                s[sp] = a[top];//继续入栈
                
                if(top > 0)//左边未匹配完
                    top--;//继续匹配
                else
                    return 1;
            }
        }       
        else    //左边匹配到最后一个符号
        {
            if(sp == 0)//右边也是最后一个符号
                return 0;
            else    //右边不为最后一个符号
                return 1;
        }
    }
    else    //不匹配,继续入栈
    {
        if(a[top] == '}' || a[top] == ']' || a[top] == ')')//表达式无误
        {
            s[++sp] = a[top];
            
            if(top > 0)
                top--;
            else
                return 1;
        }
        else    //表达式有误
            return 1;
    }
    return 2; 
}

int main()
{
    int ret = 1;
    top = strlen(a) - 1;
    sp = 0;
    s[sp] = a[top--];

    while(ret)
    {
        switch(s[sp])
        {
            case ')':
                ret = match('(');
                break;
            case ']':
                ret = match('[');
                break;
            case '}':
                ret = match('{');
                break;
            default:
                printf("表达式有错误!\n");
                return 1;
        }
        if(ret == 1)
        {
            printf("表达式匹配不成功!\n");
            return 1;
        }
    }
    printf("表达式匹配成功!\n");
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值