首页 > 代码库 > 括号匹配(字符串)
括号匹配(字符串)
问题描述:
检查字符串表达式中的括号是否匹配;
左括号数目同有括号数目不相等即为不匹配;
去除多余的左括号或者右括号,优先保留先出现的括号;
匹配后去除无效的括号:如:((表达式)) 应为(表达式);
只考虑小括号,不考虑先出现右括号的情况;
要求实现函数: (字符串最长长度为60;表达式正确性不需要考虑)
void Bracket(char* src, char* dst);
如果匹配则通过dst 输出原串;
如果不匹配则根据要求去处多于括号后通过dst 输出匹配后的串
示例
输入:12+(345*25-34) 输出:12+(345*25-34)
输入:12+(345*(25-34) 输出: 12+(345*25-34)
输入:(12+345)*25)-34 输出: (12+345)*25-34
输入:(543+(256-43)*203))+24
输出:(543+(256-43)*203)+24
输入:((1+2)*((34-2))+((2*8-1)
输出:((1+2)*(34-2)+2*8-1)
#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;void leftRight(string s,vector<int> &leftBracket,vector<int> &rightBracket){ unsigned len = s.size(); leftBracket.clear(); rightBracket.clear(); for(unsigned i=0;i<len;i++) { if(s[i]==‘(‘) leftBracket.push_back(i); else if(s[i]==‘)‘) rightBracket.push_back(i); }}void Bracket(char* src, char* dst){ vector<int> leftBracket,rightBracket;//存放左右括号的下标 unsigned len = strlen(src); string s(src,src+len); leftRight(s,leftBracket,rightBracket); unsigned len1 = leftBracket.size(),len2=rightBracket.size(); while(len1>len2) { s.erase(leftBracket[len1-1],1); leftRight(s,leftBracket,rightBracket); len1--; } while(len1<len2) { s.erase(rightBracket[len2-1],1); leftRight(s,leftBracket,rightBracket); len2--; } unsigned k1 ,k2 ; vector<int> era;//要删除的元素的下标 for(k1 = len1-1;k1>0;k1--)//删除不需要的括号对 { if(leftBracket[k1]-leftBracket[k1-1]!=1) { for(k2 = 0;k2<len2;k2++) { if(leftBracket[k1]<rightBracket[k2]) { rightBracket[k2]=0; break; } }//end for }//end if else { for(k2 = 0;k2<len2-1;k2++) { if(leftBracket[k1]<rightBracket[k2] && leftBracket[k1-1]<rightBracket[k2+1] && rightBracket[k2+1]-rightBracket[k2]==1) { era.push_back(leftBracket[k1]); era.push_back(rightBracket[k2]); rightBracket[k2]=0; break; } }//end for }//end else } //end forif(era.size()!=0)//有大下标到小下标依次删除多余的括弧{ sort(era.begin(),era.end()); for(int i=era.size()-1;i>=0;i--) { s.erase(era[i],1); }}strncpy(dst,&s[0],s.size());dst[s.size()]=‘\0‘;}void main(){ char* src = http://www.mamicode.com/"((1+2)*((34-2))+((2*8-1)"; char* dst = new char[100]; Bracket(src, dst); puts(dst);}
注意事项:
如果用string的erase函数,一用此函数,string的大小和以前的下标与字符串对应关系就改变了,这一点编程时要特别注意!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。