关闭

括号匹配

222人阅读 评论(0) 收藏 举报
分类:

用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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2537次
    • 积分:105
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档