假设一个算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。
顺序表类型定义如下:
可使用的相关类型和函数:
顺序表类型定义如下:
typedef struct {
ElemType *elem;
int length;
int listsize;
} SqList; // 顺序表
Stack是一个已实现的栈。
可使用的相关类型和函数:
typedef char SElemType; // 栈Stack的元素类型
Status InitStack(Stack &s);
Status Push(Stack &s, SElemType e);
Status Pop(Stack &s, SElemType &e);
Status StackEmpty(Stack s);
Status GetTop(Stack s, SElemType &e);
实现函数如下:
Status MatchCheck(SqList exp)
/* 顺序表exp表示表达式; */
/* 若exp中的括号配对,则返回TRUE,否则返回FALSE */
{
Stack s;
SElemType c;
ElemType *p = exp.elem;
int state = 0;
InitStack(s);
while(p < exp.elem + exp.length){
if(*p == '{' || *p == '[' || *p == '('){
Push(s,*p);//遇到"("或者"["或者"{"将其压入栈
}
else if(*p == '}' || *p == ']' || *p == ')'){
if(StackEmpty(s))return FALSE;//此时栈为空,即前面不再有"("或者"["或者"{",后面继续出现")"或者"]"或者"}",则返回FALSE
GetTop(s,c);
switch(c){ //匹配栈顶元素
case '(' : {
if(*p == ')'){
Pop(s,c);
state = 1;
break;
}
else return FALSE;
}
case '[' : {
if(*p == ']'){
Pop(s,c);
state = 1;
break;
}
else return FALSE;
}
case '{' : {
if(*p == '}'){
Pop(s,c);
state = 1;
break;
}
else return FALSE;
}
}
}
p++;
}
if(StackEmpty(s))state = 1;//栈内元素完全被匹配完
else state = 0;
if(state == 1)return TRUE;
else return FALSE;
}