1.问题描述
对一个字符串的左右括号进行匹配,字符串(a*(b+c)+d)在位置0和3有左括号,在位置7和10有右括号。位置0和位置10的右括号匹配,位置3的左括号和位置7的有括号匹配。
2.求解策略
如果从左至右地扫描一个字符串,那么每一个右括号都与最近扫描的那个未匹配的左括号相匹配。从左到右地扫描过程中,将扫描到的左括号保存到栈中,每当扫描到一个右括号,就将它和栈顶的左括号相匹配,并将匹配的左括号从栈顶删除。
3.C++实现
void printMatchedParis(string expr)
{
std::stack<int> s;
int length=(int)expr.size();
//扫描表达式expr,寻找左括号和右括号
for(int i=0;i<length;i++)
{
if(expr.at(i)=='(')
{
s.push(i);
}
else
{
if(expr.at(i)==')')
{
try
{
cout<<s.top()<<' '<<i<<endl;
}
catch (stackEmpty)
{
cout<<"无匹配at"<<i<<endl;
}
}
}
}
while(!s.empty())
{
cout<<"无匹配at"<<s.top()<<endl;
s.pop();
}
}