括号匹配

原创 2015年07月07日 15:30:42

用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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

使用栈判断括号匹配

判读括号是否匹配的方法比较简单,假如给定一系列的括号,判断是否全部都匹配我们肯定是将能匹配的括号全部删除,如果最后没有剩下任何括号那么肯定就是匹配了;如有剩下的左括号或者右括号说明不匹配。      ...
  • xiongyangg
  • xiongyangg
  • 2015年04月17日 20:42
  • 1565

数据结构实验之栈四:括号匹配(栈的运用)

数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给你一串字符,不超过50个字符,...
  • jert159
  • jert159
  • 2014年08月11日 21:26
  • 1219

c++STL的stack的应用之括号匹配

有个问题是要匹配资格字符串中的左右括号,如(a*(b+c)+d)在位置1和4有左括号,在位置8和11有右括号。可以观察到如果从右向左扫描,那么每个右括号都与最近遇到的那个未匹配的左括号相匹配。现在直接...
  • u013380306
  • u013380306
  • 2017年03月04日 21:34
  • 245

栈的应用之括号匹配检验

栈结构具有后进先出的固有特性,在程序设计中很有帮助。这里举一个例子,将栈应用与括号匹配的检验。         假设表达式中允许三种括号:小括号、中括号和大括号,嵌套的顺序任意。( [ ] ) { ...
  • u014715006
  • u014715006
  • 2015年04月04日 16:19
  • 3096

C++STL库栈算法的括号匹配

很久没写了,原因是懒惰……另外大一在学校也难上网……不说了 昨天晚上看了C++的STL库,感觉C++功能非常的强大呢! 于是刚好想起了以前用C写了一个括号匹配,很复杂,具体思路是先把括号转换为...
  • giglf
  • giglf
  • 2015年03月21日 00:26
  • 823

括号匹配方案

问题一个串只包含有’(‘和’)’,如果每个左括号都能和一个右括号匹配,且左括号在左边,右括号在右边,那么称这个串是括号匹配的。比如”(())”,”()()”都是括号匹配的,”)(“,“())(“都不是...
  • qq_33699981
  • qq_33699981
  • 2017年03月29日 22:42
  • 2161

sdut 2134 数据结构实验之栈与队列四:括号匹配

数据结构实验之栈与队列四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem...
  • sxy201658506207
  • sxy201658506207
  • 2017年10月10日 18:40
  • 125

数据结构之---C语言实现括号匹配(栈实现)

数据结构之---C语言实现括号匹配(栈实现)
  • u012965373
  • u012965373
  • 2015年09月13日 20:50
  • 5959

SDUTOJ 2134--括号匹配

从前往后遍历字符串,当遇到左括号是
  • sxj1995
  • sxj1995
  • 2014年09月12日 19:58
  • 438

关于括号匹配数目的动态规划算法的解决方法

前段时间在做关于华为OJ平台的闯关题目,第三关中有一道关于
  • u012754897
  • u012754897
  • 2014年07月11日 19:56
  • 2242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:括号匹配
举报原因:
原因补充:

(最多只允许输入30个字)