题目:
17、括号匹配的检验(限2人完成)
通过键盘输入一个表达式,其中包含圆括号和方括号(如:()[]),圆括号和方括号时成对出现,其中可以出现嵌套。嵌套形式如([]())或者[([][])]均为正确的格式,而[()或者([()]或者(()]均为错误格式。对输入的表达式,进行括号匹配的检查,如果匹配成功,返回1,匹配不成功,返回0。
具体实现:参考课本P76案例3.2。
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef char SElemType;
#define OK 0
#define ERROR 1
#define OVERFLOW -2
typedef int Status;
typedef struct
{
SElemType *base;
SElemType *top;
Status stacksize;
}SqStack;
Status InitStack(SqStack* S)
{
S->base =(char*)malloc(sizeof(SElemType) * MAXSIZE);
if( !S->base ) return OVERFLOW;
S->top = S->base;
S->stacksize = MAXSIZE;
return OK;
}
Status StackLength( SqStack S )
{
return S.top - S.base;
}
Status Push( SqStack* S, SElemType e)
{
if( S->top - S->base== S->stacksize )
return ERROR;
*S->top++=e;
return OK;
}
SElemType Pop( SqStack* S, SElemType e)
{
if( S->top == S->base )
{
return 'w';
}
e=*--S->top;
return e;
}
Status DestroyStack( SqStack* S )
{
if( S->base )
{
free(S->base);
S->stacksize = 0;
S->base = S->top = NULL;
}
return OK;
}
Status isLeft(char c)
{
Status ret = 0;
switch(c)
{
case '(':
case '[':
case '<':
case '{':
case '\'':
case '\"':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
Status isRight(char c)
{
Status ret = 0;
switch(c)
{
case ')':
case ']':
case '>':
case '}':
case '\'':
case '\"':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
Status match(char left, char right)
{
Status ret = 0;
switch(left)
{
case '(':
ret = (right == ')');
break;
case '[':
ret = (right == ']');
break;
case '<':
ret = (right == '>');
break;
case '{':
ret = (right == '}');
break;
case '\'':
ret = (right == '\'');
break;
case '\"':
ret = (right == '\"');
break;
default:
ret = 0;
break;
}
return ret;
}
Status judge(const char* code)
{
SqStack stack;
InitStack(&stack);
Status ret=0;
Status i=0;
while( code[i] != '\0')
{
if(isLeft(code[i]))
{
Push(&stack,code[i]);
}
else if(isRight(code[i]))
{
char c = Pop(&stack,*(stack.top));
if(c=='w' || !match(c,code[i]))
{
printf("%c 匹配失败!\n",code[i]);
break;
}
}
i++;
}
if((StackLength(stack)==0)&&(code[i]=='\0'))
{
printf("成功!\n");
ret = 1;
}
else if((StackLength(stack)!=0))
{
printf("左括号有多余,匹配失败\n");
ret = 0;
}
DestroyStack(&stack);
return ret;
}
void main()
{
char* str = (char*)malloc(sizeof(char)*MAXSIZE) ;
scanf("%s",str);
judge(str);
free(str);
}
