码迷,mamicode.com
首页 > 其他好文 > 详细

括号匹配(字符串)

时间:2014-07-07 23:43:26      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   问题   for   

问题描述:
检查字符串表达式中的括号是否匹配;
左括号数目同有括号数目不相等即为不匹配;
去除多余的左括号或者右括号,优先保留先出现的括号;
匹配后去除无效的括号:如:((表达式)) 应为(表达式);
只考虑小括号,不考虑先出现右括号的情况;
要求实现函数: (字符串最长长度为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 for
if(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 = "((1+2)*((34-2))+((2*8-1)"; 
    char* dst = new char[100];
    Bracket(src, dst);    
    puts(dst);
}

注意事项:

如果用string的erase函数,一用此函数,string的大小和以前的下标与字符串对应关系就改变了,这一点编程时要特别注意!

括号匹配(字符串),布布扣,bubuko.com

括号匹配(字符串)

标签:style   blog   color   os   问题   for   

原文地址:http://www.cnblogs.com/Xylophone/p/3812719.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!