问题描述
编写算法,判断一个表达式的括号是否正确配对。
问题分析
从左往右看这个表达式中的括号,看到一个“(”就记住它(这里可以理解为入栈),如果下一个括号是")"(这里可以理解为出栈),则去掉这两个括号,一对括号处理完毕继续往后看。如果前边所有的括号都被划掉,而下一个括号是")",则括号一定不匹配,因为")“之前已经没有括号和它匹配了。如果下一个括号是”(",则暂时不管前一个"(",先把它放在那里,等后边的"(“处理掉后再来处理它。后边的”(“处理掉才能回来处理先前的”(",这里体现了栈的后进先出特点。以后看到的括号要么是"(“要么是”)",就用前边的方法来处理。如果到最后所有的括号都被划掉,则匹配。否则就不匹配。
代码
int match(string exp){
char stack[MAXSIZE];
int top = -1; //两句话完成栈的定义和初始化
for(int i = 0; i < exp.length ; ++i){
if(exp[i] == '('){ //如果遇到'(',则入栈等待处理
stack[++top] = '(';
}else if(exp[i] == ')'){
if(top == -1) //当前遇到')'且栈空则不匹配,返回0表示不匹配
return 0;
else
top--; //如果栈不空,遇到')'则出栈,相当于划掉两个匹配的括号
}
}
if(top == -1) //处理完后栈空说明匹配
return 1;
else
return 0;
}
总结
在解决问题的过程中出现了一个子问题,但凭现有条件不能解决它,需要记下,等待以后出现可以解决它的条件后再返回来解决。这种问题需要用栈来解决,栈具有记忆功能,这是栈的FILO特性所延伸出来的一种特性。