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