您的位置:首页 > 理论基础 > 数据结构算法

判别给定表达式中所含括号是否正确配对出现的算法

2014-04-25 23:30 288 查看
假设一个算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法。

顺序表类型定义如下:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐