1 问题描述
编写一个算法,判断键盘输入的表达式是否配对。(假设括号只包含“(” “)” 。
2 分析
(1)所谓括号配对,就是
- 左括号的个数等于右括号的个数,
- 且每一对括号都是左括号在左边,右括号在右边。
- 一对括号都没出现,也看作匹配。
(2)输入的字符串中,可能包含”(”,“)”(也可能没有),数字,及其他符号。
(3)每当扫描字符串元素中出现 “)”,需要进行括号匹配检查。检查方式为——
看最近出现的"(",而用什么保存 “(”呢? 栈是选择之一。
那栈的存储状态是,要么有"(",要么为空。
(4)根据以上分析,整个算法的流程是:
-
遍历输入的字符串,
-
如果扫描到“ (", “ ("入栈
-
否则,如果扫描到")",
- 判断当前栈是否为空,
- 若为空,不匹配,结束遍历。
- 若不为空,则获取栈顶元素,若栈顶元素是")",这对括号匹配成功。“(”出栈。
-
直到发现不匹配或者字符串终止。
-
如果扫描字符串终止后,栈中还有元素,则配对不成功。
3 代码
#include <stdio.h>
bool isMatchParen(ElementType *expression)
{
bool isMatch=true;
Stack *s;
initStack(s);
for(;*expression!='\0' && isMatch;expression++)
{
if(*expression=='(')
push(s,*expression);
else if(*expression==')')
{
if(isStackEmpty(s)!=0)
isMatch=false;
else
{
ElementType e=getTopElement(s);
if(e=='(')
{
pop(s);
}
}
}
}
if(!isStackEmpty(s))
isMatch=false;
DestroyStack(s);
return isMatch;
}
4 总结
(1)获取栈顶元素和出栈 的区别以及使用场景。
参考文献
《数据结构教程》 第四版 李春葆等