题目要求:对形如”(1,2, 3,(4,5,(6,5),8,4)),(2,3,(1,2),4,5)”的字符串进行处理,如果存在括号嵌套情况(….(…)…),将里面的括号删除。
处理思想:
设置count,用来记录当前待匹配删除的‘(’的个数,count初值设为-1,这样是为了保证不会把最外层的括号给删除掉,当然,初值设为0,然后修改判断也可,只是意义表达会不明确,你说呢?每次读到一个‘(’,count立刻+1,然后判断此时的‘(’是不是最外层的【count=0】,不是的话【count>0】就删除这个括号;每次读到’)’,则根据count值来判断当前的‘)’是不是最外层的【count>0,说明还有嵌套的‘(’需要匹配,所以当前的‘)’肯定不是最外围的】,则删除当前的右括号,count-1。
// DeleteRepeatBrackets.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <IOSTREAM>
#include <STRING>
#include <STACK>
using namespace std;
bool IsMatched(const string & pStr)
{
if (pStr.empty())
{
return true;
}
stack<char> brackets;
string::const_iterator iter;
for (iter=pStr.begin();iter<pStr.end();iter++)
{
if (*iter=='(')
{
brackets.push(*iter);
}
else
{
if (*iter==')')
{
if (brackets.size()>0&&brackets.top()=='(')
{
brackets.pop();
}
else
{
return false;
}
}
}
}
if (brackets.size()==0)
{
return true;
}
else
{
return false;
}
}
void DeleteRepeatBrackets(string & pStr)
{
if (pStr.empty())
{
return;
}
int count=-1;
string::iterator iter;
for(iter=pStr.begin();iter<pStr.end();iter++)
{
if (*iter=='(')
{
++count;
if (count>0)
{
pStr.erase(iter);
iter--;//调用erase时,iter会自动指向下一个元素,必须手动-1,否则for里再+1会跳过下一个元素
}
}
else{
if (*iter==')')
{
if (count>0)
{
pStr.erase(iter);
iter--;
}
--count;
}
}
}
}
int main(int argc, char* argv[])
{
string str="(1,2, 3,(4,5,(6,5),8,4)),(2,3,(1,2),4,5)";
if(IsMatched(str))
{
cout<<"括号匹配成功"<<endl;
DeleteRepeatBrackets(str);
cout<<str<<endl;
}
else
{
cout<<"括号不匹配"<<endl;
}
return 0;
}