括号匹配

原创 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;
}


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

相关文章推荐

c++括号匹配

  • 2014年12月05日 15:26
  • 168KB
  • 下载

SDUT 2134 数据结构实验之栈四:括号匹配

数据结构实验之栈四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript...

括号匹配加表达式

  • 2014年11月16日 21:43
  • 2KB
  • 下载

括号匹配程序

  • 2013年10月10日 14:41
  • 210KB
  • 下载

括号匹配--今日头条2017年实习生招聘笔试题

Java版本:package Interview;import java.util.Scanner; import java.util.Stack;/** * @date: 30/03/2017 7...

括号匹配问题

  • 2011年12月24日 14:31
  • 69KB
  • 下载

括号匹配C程序

  • 2012年10月15日 16:16
  • 2KB
  • 下载

java堆栈类解决括号匹配问题

转载自:http://blog.csdn.net/u012706811/article/details/50791858 java.util包中提供了stack这个类,可以利用堆栈解决很多问...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:括号匹配
举报原因:
原因补充:

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