为了判断花括号是否成功匹配的问题,我们依然要使用栈的特性。
bool MatchBrackets(char* pStr, int len)
{
stack<char> Bra; //在这里我们为了存取花括号,创建了一个栈
for(int i = 0;i<len;i++)
{
if ((pStr[i] == '(')||(pStr[i] == '{')||(pStr[i] == '[')) //当我们读取到左花括号时就将它压进栈内
{
Bra.push(pStr[i]);
}
else if(pStr[i]==')'|| pStr[i] == '}' || pStr[i] == ']' ) //当我们读取到右花括号时,我们将栈顶元素拿出来,看是否与它匹配
{
if (Bra.empty()) //在这里,当我们读到了一个右花括号,但是栈内没有元素时,这个花括号一定是多余的
{
cout << "右括号多余!" << endl;
return false;
}
else if(((pStr[i] == ')') && (Bra.top() == '(')) || ((pStr[i] == ']') && (Bra.top() == '[')) || \
((pStr[i] == '}') && (Bra.top() == '{')))
{
Bra.pop(); //当我们读取到栈顶元素,发现刚好与之对应时,将栈顶元素顶出
}
else
{
cout << "右括号多余!" << endl; //剩下情况就为这个右括号多余
return false;
}
}
else{}
}
if (Bra.top() == '(' || Bra.top() == '[' || Bra.top() == '{')
{
cout << "左括号多余!" << endl; //当我们把元素读取完后,发现栈顶还存在左括号,那么它就是多余的了
}
return Bra.empty();
}
接下来我们来测试一下这段代码是否正确:
int main()
{
char str[] = "({()()()}";
int len = strlen(str);
bool ret = MatchBrackets(str, len);
if (ret == 1)
cout << "匹配成功!";
else
cout << "匹配失败!";
getchar();
return 0;
}
在这个函数里我们能看出我给出的花括号是第一个左括号多余的
在这里可以看出这个代码是正确的,其他判断也都没有问题,鉴于太多,就不在重复试验了。