对于一个合法的数学表达式来说,其中的各大小括号"{", “}”, “[”. “]”, “(”, ")"应该是相互匹配的,输入算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。
ps: 判断一个数学表达式的括号是否匹配,不仅要判断其左右大小括号的数量是否对应相等,还要判断括号的匹配次序是否正确。
算法思想: 顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候,执行进栈操作;当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,出栈一次并继续判断;若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;若字符串当前为某种类型的右括号而栈已经空,则右括号多于左括号;字符串循环扫描结束时,若栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;否则,括号配对正确。
//判断一个数学表达式是否合法
bool bracketMatch2(string str) {
seqStack S;//定义一个栈
initialStack(S);//初始化
int len = str.length();//获得数学表达式的长度
bool tag = true;
bool result;
int i = 0;
elementType x;
while (i < len && tag == true) {
switch (str[i]) {
//所有左括号入栈
case '(':
case '[':
case '{':
if (!stackFull(S))
pushStack(S, str[i]);
break;
case ')':
//扫描到右括号时,如果当前栈空,右括号多于左括号
if (stackEmpty(S)) {
tag = false;
result = false;
break;
}
//得到栈顶元素,并出栈
popStack(S, x);
if(x == '(') {
break;
}
//匹配次序不正确
else {
tag = false;
result = false;
break;
}
case ']':
if (stackEmpty(S)) {
tag = false;
result = false;
break;
}
popStack(S, x);
if (x == '[') {
break;
}
else {
tag = false;
result = false;
break;
}
case '}':
if (stackEmpty(S)) {
tag = false;
result = false;
break;
}
popStack(S, x);
if (x == '{') {
break;
}
else {
tag = false;
result = false;
break;
}
default:
break;
}
i++;
}
if (tag == true) {
result = true;
}
else {
result = false;
}
return result;
}