在各大公司的笔试题中,我们经常会遇到关于括号匹配的问题。其实匹配问题中主要运用到的数据结构就是栈,例如对一个字符串进的左右括号进行匹配,字符串(a*(b+c)+d)在位置0和位置3有左括号,在位置7和10有右括号,位置0的左括号与位置10的右括号相匹配,位置3左括号和位置7的右括号进行匹配。在字符串(d+f))( 中,位置5的左括号和位置6的右括号都没有与之相配的括号。在这种问题一般要求输入一个字符串,然后输出匹配的括号以及不匹配的括号。
解题方法:通过观察字符串,我们可以发现,每一个右括号都会与最近的左括号进行匹配,当我们从左至右进行字符扫描的时候,遇到左括号的时候我们将左括号进行入栈操作。然而,当我们遇到一个右括号的时候,判断栈是否为空,如果栈为空说明没有相对应的左括号与之相匹配,这时我们输出没有匹配的右括号,然后继续上述操作。如果栈不为空的话,我们取出栈顶的左括号(并将该左括号从栈中删除)与扫描到的右括号进行匹配,输出匹配的括号,继续下一轮操作直至扫描完成。
以下是具体的C++程序
void printMatchedPairs(string expr)
{
arrayStack<char> s;
int length = (int)expr.size();
//扫描表达式expr 寻找左括号和右括号
for(int i=0;i<length;i++)
{
if(expr.at(i) == '(')
{
s.push(expr.at(i))
}
else
{
if(expr.at(i) == ')')
{
try
{
cout<<s.top()<<' '<<i<<endl; //取出栈顶的数据
s.pop(); //该数据出栈
}
catch(s.empty()) //若栈为空,说明该右括号没有被匹配
{
cout<<"该右括号没有与之匹配的左括号!"<<i<<endl;
}
}
}
//判断是否有剩下的左括号
while(!s.empty())
{
cout<<"没有匹配的左括号"<<s.top()<<endl;
s.pop();
}
}
}