Gym

题意:给一个包含括号的字符串,要你把所有能去掉的括号都去掉,然后再把原字符串输出

思路:首先对括号进行配对,配对完之和,对括号进行排序(按照左右两括号的距离差进行排序),之后再进行判断

有几种情况

1.对于括号前面和后母没有符号的,那么说明这个括号是一定可以去掉的

2.对于括号前面是加号括号后面没有乘除的话,也是可以去掉的

3.对于减号的话,如果可以去掉括号,记得加减变号

4.对于乘除,得看里面有没有+-,有的话,说明这个括号是不能去掉的,不能去掉的时候,记得进行标记,目的是下次扫描可以跳过这个括号

除法和减法可以变号

代码写得有点乱

  1 //locy
  2 
  3 #include <algorithm>
  4 #include <stdio.h>
  5 #include <string.h>
  6 #include <stack>
  7 using namespace std;
  8 
  9 char str[1010];
 10 struct Brackets{
 11     int x,y;
 12     int dis;
 13 }brackets[500];
 14 bool change[1005];
 15 stack<int>s;
 16 
 17 bool cmp(const Brackets &a,const Brackets &b)
 18 {
 19     return a.dis<b.dis;
 20 }
 21 
 22 int main()
 23 {
 24     freopen("brackets.in","r",stdin);
 25     freopen("brackets.out","w",stdout);
 26     //freopen("in.txt","r",stdin);
 27     scanf("%s",str+1);
 28     int len = strlen(str+1);
 29     int k = 0;
 30     for(int i = 1 ; i <= len ; i++ )
 31     {
 32         if(str[i] == '(')
 33             brackets[k].x = i,s.push(k++);
 34         else if(str[i] == ')')
 35             brackets[s.top()].y = i,s.pop();
 36     }
 37     for(int i = 0;i<k;i++)
 38         brackets[i].dis = brackets[i].y-brackets[i].x;
 39     sort(brackets,brackets+k,cmp);
 40     for(int i = 0;i<k;i++)
 41     {
 42         int flag = -1;
 43         switch(str[brackets[i].x-1])
 44         {
 45             case '+':
 46                 flag = 0;
 47                 break;
 48             case '-':
 49                 flag = 1;
 50                 break;
 51             case '*':
 52                 flag = 2;
 53                 break;
 54             case '/':
 55                 flag = 3;
 56                 break;
 57             default:
 58                 break;
 59         }
 60         bool flag2 = (str[brackets[i].y+1]=='*'||str[brackets[i].y+1]=='/')?
 61             true:false;
 62         if(flag<=0&&!flag2)  //加法以及没符号
 63                change[brackets[i].x] = change[brackets[i].y] = true;
 64         else if(flag==1&&!flag2)  //减法
 65         {
 66             change[brackets[i].x] = change[brackets[i].y] = true;
 67             bool tmp = false;
 68             for(int j = brackets[i].x;j<=brackets[i].y;j++)
 69             {
 70                 if(!change[j])     //切记这个,因为没去掉的括号里面的是不需要管的
 71                 {
 72                     if(str[j]=='+')
 73                         str[j]='-';
 74                     else
 75                         if(str[j]=='-')
 76                         str[j] = '+';
 77                 }
 78             }
 79         }else //乘除判断
 80         {
 81             int tmp = false;
 82             for(int j = brackets[i].x; j < brackets[i].y ; j++ )
 83                 if(!change[j]&&(str[j]=='+'||str[j]=='-'))
 84                         tmp = true;
 85             if(!tmp)
 86             {
 87                 for(int j = brackets[i].x;j<=brackets[i].y;j++)
 88                 {
 89                     if(flag == 3&&str[j]=='*'&&!change[j])
 90                         str[j] ='/';
 91                     else if(flag==3&&str[j]=='/'&&!change[j])
 92                         str[j]='*';
 93                 }
 94                 change[brackets[i].x] = change[brackets[i].y] = true;
 95             }
 96             else for(int j = brackets[i].x+1;j<brackets[i].y;j++)
 97                 if(str[j]!=')'&&str[j]!='(')
 98                     change[j] = true;
 99 
100         }
101     }
102     //输出
103     for(int i = 1;i<=len;i++)
104         if(str[i]=='('||str[i]==')')
105         {
106             if(!change[i])
107                 printf("%c",str[i]);
108         }
109         else printf("%c",str[i]);
110         printf("
");
111     return 0;
112 }
原文地址:https://www.cnblogs.com/Tree-dream/p/6952985.html