题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=423

Sample Input

3
(A-B + C) - (A+(B - C)) - (C-(D- E) )
((A)-( (B)))
A-(B+C)

Sample Output

A-B+C-(A+B-C)-(C-(D-E))
A-B
A-(B+C)

题目大意:给出加减代数表达式,仅由变量(大写字母表示),圆括号,加号 '+', 减号'-'组成,要求去掉多余的括号,但是不能改变表达式中的加号和减号,也就是说如果括号外面是减号,那就不能去掉

分析:

  对于每对括号标号,满足以下任意一个条件的就可以去掉,

  1.最外面的括号

  2.前面不是 减号 的括号

  3.前面是减号,但左右括号之间仅有变量,而没有 加减号 的括号。

第一反应是用栈做,但是STL的stack用在本题不方便,因为本题要遍历栈的元素,所以要自己写栈。

代码如下:

 1 # include<cstdio>
 2 # include<iostream>
 3 # include<cstring>
 4 # define MAX 300
 5 using namespace std;
 6 char str[MAX];    //输入
 7 char st[MAX];    //自定义栈
 8 int main(){
 9     int T;
10     scanf("%d",&T);
11     getchar();
12     while(T--){
13         int i,j;
14         gets(str);
15         int len=strlen(str);
16         st[0]=' ';    //如果第一个字符是'(',将情况1变成了情况2,少讨论
17         int tail=1;    //尾指针
18         for(i=0; i<len; i++){
19             if(str[i]==')'){
20                 bool flag = true;    //默认为括号里边不包含其他的'+'或'-'
21                 for(j=tail-1; j>=1; j--){
22                     if(st[j]=='('){
23                         if(st[j-1]!='-'||st[j-1]=='-'&&flag)//括号前面不是减号 或者虽是减号但仅包含变量
24                             st[j]=' ';//取消该左括号,并且不要右括号,即不处理它
25                         else{
26                             st[tail++]='Y';    //代表右括号
27                             st[j]='X';        //代表左括号
28                         }
29                         break;
30                     }
31                     else{
32                         if(st[j]=='+'||st[j]=='-')
33                             flag = false;
34                     }
35                 }
36             }
37             else{
38                 if(str[i]!=' ')
39                     st[tail++]=str[i];
40             }
41         }
42         for(i=1; i!=tail; i++){    //遍历栈元素
43             if(st[i] != ' '){
44                 if(st[i] == 'X')
45                     cout<< "(";
46                 else if(st[i] == 'Y')
47                     cout<< ")";
48                 else
49                     cout<<st[i];
50             }
51         }
52         cout<<endl;
53     }
54     return 0;
55 }

附贴网上大部分人的思路:由于是模拟题,数据很小,直接暴力就好了。先扫描一次将空格去掉,再不断扫描,将(A)类型的括号去掉,直到不能去为止。再扫描一次,将所有括号用match数组匹配起来,若 s[i]==')' 那么 match[i]为与它匹配的'('所在的下标。再扫描一次,将'('前面不为负号的括号对全部标记mark[i]=1表示可以去掉。最后扫描一次,根据mark[i]数组将多余括号去掉~~~

 1 #include<stdio.h>
 2 #include<string.h>
 3 char s[258];
 4 int mark[258],match[258],zhan[258],num,opnum;
 5 int main()
 6 {
 7     int m,i,j,l,temp;
 8
 9     scanf("%d",&m);
10     getchar();
11     while(m--)
12     {
13         gets(s);
14         memset(mark,-1,sizeof(mark));
15         memset(match,-1,sizeof(match));
16         for(l=strlen(s),i=j=0;i<l;i++)
17         {
18             if(s[i]==' ') continue;
19             s[j++]=s[i];
20         }
21         l=j,s[j]='\0',temp=1;
22         while(temp)
23         {
24             for(temp=j=i=0;i<l;i++)
25             {
26                 if(s[i]=='('&&s[i+2]==')')
27                     s[j++]=s[i+1],i=i+2,temp=1;
28                 else s[j++]=s[i];
29             }
30             l=j,s[j]='\0';
31         }
32         for(num=i=0;i<l;i++)
33         {
34             if(s[i]=='(') match[i]=i,zhan[num++]=i;
35             else if(s[i]==')') num--,match[i]=zhan[num];
36         }
37         for(i=0,temp=1;i<l;i++)
38         {
39             if(s[i]=='('&&temp==1) mark[i]=1;
40             else if(s[i]==')'&&mark[match[i]]==1) mark[i]=1;
41             if(s[i]=='-') temp=0;
42             else temp=1;
43         }
44         for(i=j=0;i<l;i++)
45         {
46             if(s[i]=='('&&mark[i]==1) continue;
47             else if(s[i]==')'&&mark[i]==1) continue;
48             s[j++]=s[i];
49         }
50         s[j]='\0';
51         printf("%s\n",s);
52     }
53
54     return 0;
55 }

ZOJ 1423 (Your)((Term)((Project))) (模拟+数据结构)相关推荐

  1. UVALive 6511 Term Project

    Term Project Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origi ...

  2. 算法模版:模拟数据结构之绪论【沈七】

    算法模版:模拟数据结构之绪论 前言 什么是数据结构? 先看数据 再看结构 一些术语 逻辑结构 储存结构 完结散花 参考文献 前言 唤我沈七就好. 算下来应该是有两周没更新了. 是因为最近一直在研究数据 ...

  3. qu(判定操作序列)NOIP模拟 数据结构判断 模拟

    [问题描述] 给你一个操作序列,问这个维护操作序列的数据结构是哪一种? [输入格式] 第一行是一个正整数?代表操作数目. 接下来?行,每行两个正整数???, ?.如果??? = 1,代表我们将?加入数 ...

  4. aov建立Java模拟,数据结构之---C语言实现拓扑排序AOV图

    //有向图的拓扑排序 //杨鑫 #include #include #include #define MAX_NAME 3 #define MAX_VERTEX_NUM 20 typedef int ...

  5. 【ZOJ - 3946】Highway Project(最短路子图,维护双权值,贪心,最小树形图)

    题干: Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he ...

  6. 一维数组模拟数据结构-------栈

    1.用一维数据模拟栈结构 public class Stack1{//一维数据模拟栈结构 Object[] elements;//默认栈的容量为5public Stack1(){this(5); // ...

  7. 2018青岛ICPC ZOJ 4061: Magic Multiplication(模拟)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意: 定义一种新型运算符: 也就是说Gao(23, 45 ...

  8. 电梯模拟 数据结构课设

    代码: https://download.csdn.net/download/TYtrack/19384997 报告: https://download.csdn.net/download/TYtra ...

  9. 【zoj 3547】【zoj 3548】8.17模拟赛

    题目来源:未知,zoj3547,3548 t1 [问题描述] 若干年之后,XJH找工作面试,面试官给了他这样一个题目. 你有一个N*N的回型矩阵,保证N是奇数. 例如,当N=5的时候,矩阵如下: 现在 ...

最新文章

  1. SharePoint 2013的100个新功能之网站管理(二)
  2. Ajax请求中的async:false/true的作用
  3. Ant Design Vue select下拉列表设置默认值
  4. Request_原理
  5. 实现一个MVVM和promise
  6. 如何启用SAP Cloud Platform的mobile服务
  7. ad中电容用什么封装_二极管在电路中到底做什么用的
  8. toj 4613 Number of Battlefields
  9. Netty实战——Channel、EventLoop和ChannelFuture详解
  10. getTime()的兼容性(ios)
  11. android三国2,三国演义2单机版安卓
  12. cc2500的SPI
  13. fw150r虚拟服务器设置,迅捷 FW150R 无线路由器端口映射设置指南
  14. 每秒浮点运算次数FLOPS
  15. 计算机电子贺卡制作圣诞节,圣诞电子贺卡制作方法
  16. 结构化数据、半结构化数据、非结构化数据的对比
  17. Hadoop2.0高可用集群搭建【保姆级教程】
  18. FITC-Dextran,Dextran-FITC,右旋糖酐荧光素,一种被标记的多糖
  19. access与trunk详细解析+区别
  20. 错误:can‘t create 事务 lock on /var/lib/rpm/.rpm.lock (只读文件系统)

热门文章

  1. 【Spring实战】—— 5 设值注入
  2. STC15分时内核中函数指针的使用问题
  3. [推荐推荐][提供下载]ORACLE SQL:经典查询练手系列文章收尾(目录篇)
  4. REM——适合移动开发的自适应方案
  5. 微软一顿操作猛如虎,PowerShell排名直线上升
  6. 1562. [NOI2009]变换序列【二分图】
  7. Linux-什么是二进制包,源码包,RPM包,软件仓库
  8. .NET 动态向Word文档添加数据
  9. Win2D 官方文章系列翻译 - 避免内存泄漏
  10. DNS and BIND