|
假设一个算术表达式中包括()、[]、{}三种类型的括弧,编写一个判别表达式中括弧是否正确配对的函数correct(exp,tag); 其中:exp为字符串类型的变量(可理解为每个字符占用一个数组元素),表示被判别的表示式。 tag为布尔型变量。
思路:用栈st进行判定,遇到(、[、{时入栈,当遇到)、]、}时,检查当前栈顶元素是否是对应的(、[、{,若是则退栈,否则返回表示不配对。当整个算术表达式检查完毕时,若栈空则表示括弧正确配对,否则不匹配。 伪代码: #define m0 100 //m0为字符串中最大字符个数 char exp[m0];
int tag;
bool correct(exp,tag)
{ char st[m0]; int top=0,i=1;
tag=1;
while(i<=m0&&tag){ if(exp[i]=='('||exp[i]=='['||exp[i]=='{') {top++;st[top]=exp[i];} //遇到(、[、{入栈 if(exp[i]==')') {if(st[top]=='(')top--; else tag=0;} //遇到')',若栈顶是'(',则继续处理,否则返回不匹配 if(exp[i]==']') {if(st[top]==']')top--; else tag=0; } //遇到']',若栈顶是'[',则继续处理,否则返回不匹配 if(exp[i]=='}') {if(st[top]=='}')top--; else tag=0; } //遇到'}',若栈顶是'{',则继续处理,否则返回不匹配 i++;
}//while
if(top>0) tag=0; //若栈不空,则不匹配
if(tag=1)return TURE; //若tag=1,则表示匹配,否则返回不匹配
else return FALSE;
}//correct
示例2: bool Matching(char exp[]){ int state=1; ch=*exp++; while(ch!=’#’&&state){ switch (ch){ case “(”:Push(S,ch);break; case ”)”:{ if(!StackEmpty(S)&&GetTop(S)=’(’) Pop(S,e); else state=0;break; } }//switch ch=*exp++; }//while if(state&&StackEmpty(S)) return TURE; else return FALSE; }//Matching
|