括号匹配(字符串)

问题描述:
检查字符串表达式中的括号是否匹配;
左括号数目同有括号数目不相等即为不匹配;
去除多余的左括号或者右括号,优先保留先出现的括号;
匹配后去除无效的括号:如:((表达式)) 应为(表达式);
只考虑小括号,不考虑先出现右括号的情况;
要求实现函数: (字符串最长长度为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

时间: 2024-12-21 01:19:56

括号匹配(字符串)的相关文章

华为OJ:2199 判断输入字符串中的括号匹配

根据不同的括号有个计数器,在遍历时,当计数器小于0则返回false或者当遍历完后,计数器仍旧不为零,也返回false. import java.util.Scanner; public class bracketsMatch { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); int a=0; int b=0; int c=0; for

括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不

动态规划(2)--括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超

括号匹配问题(C++、堆栈)

原文地址:http://www.cppblog.com/GUO/archive/2010/09/12/126483.html /* 括号匹配问题,比较经典,利用堆栈来实现(摘自internet) 1. 括号匹配的四种可能性: ①左右括号配对次序不正确 ②右括号多于左括号 ③左括号多于右括号 ④左右括号匹配正确 2. 算法思想: 顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈: 当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断: 若当

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

The application of the stack—Parentheses Matching(括号匹配)

The thought of the algorithm is as follows: (1) Initially set up an empty stack, sequentially read in parentheses; (2) If it is a right parentheses, or it matches the stack top element, or it is illegal; (3) If it is a left parentheses, it will be pu

华为上机练习题--括号匹配检测

题目: 输入一串字符串,其中有普通的字符与括号组成(包括'('.')'.'[',']'),要求验证括号是否匹配,如果匹配则输出0.否则输出1. Smple input:dfa(sdf)df[dfds(dfd)]    Smple outPut:0 分析: 类似于括号字符匹配这类的问题, 我们可以模拟栈的操作来进行验证, 这样问题就简单了, 就是栈的操作 代码如下: package com.wenj.test; import java.util.ArrayList; import java.uti

nyoj 15 括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不

8586 括号匹配检验

今天把数据结构学习的代码拿出来和网友分享一下,应该测试能过! Time Limit:1000MS  Memory Limit:1000K Total Submit:679 Accepted:182 Type: Program   Language: Not Limited Description 利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式.