• 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 }
  • 相关阅读:
    CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
    telnet: Unable to connect to remote host: Connection refused
    bash: telnet: command not found (Linux安装telnet)
    telnet: Unable to connect to remote host: No route to host
    IP地址转换函数
    Linux 网络通信 API详解【转载】
    高效算法求解数独
    Java创建List、Map等集合对象的同时进行赋值操作
    根据先序遍历和中序遍历建立二叉树
    继承内部类时使用外部类对象.super()调用内部类的构造方法
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/6952985.html
Copyright © 2020-2023  润新知