题目链接: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用在本题不方便,因为本题要遍历栈的元素,所以要自己写栈。

代码如下:

 # include<cstdio>
# include<iostream>
# include<cstring>
# define MAX
using namespace std;
char str[MAX]; //输入
char st[MAX]; //自定义栈
int main(){
int T;
scanf("%d",&T);
getchar();
while(T--){
int i,j;
gets(str);
int len=strlen(str);
st[]=' '; //如果第一个字符是'(',将情况1变成了情况2,少讨论
int tail=; //尾指针
for(i=; i<len; i++){
if(str[i]==')'){
bool flag = true; //默认为括号里边不包含其他的'+'或'-'
for(j=tail-; j>=; j--){
if(st[j]=='('){
if(st[j-]!='-'||st[j-]=='-'&&flag)//括号前面不是减号 或者虽是减号但仅包含变量
st[j]=' ';//取消该左括号,并且不要右括号,即不处理它
else{
st[tail++]='Y'; //代表右括号
st[j]='X'; //代表左括号
}
break;
}
else{
if(st[j]=='+'||st[j]=='-')
flag = false;
}
}
}
else{
if(str[i]!=' ')
st[tail++]=str[i];
}
}
for(i=; i!=tail; i++){ //遍历栈元素
if(st[i] != ' '){
if(st[i] == 'X')
cout<< "(";
else if(st[i] == 'Y')
cout<< ")";
else
cout<<st[i];
}
}
cout<<endl;
}
return ;
}

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

 #include<stdio.h>
#include<string.h>
char s[];
int mark[],match[],zhan[],num,opnum;
int main()
{
int m,i,j,l,temp; scanf("%d",&m);
getchar();
while(m--)
{
gets(s);
memset(mark,-,sizeof(mark));
memset(match,-,sizeof(match));
for(l=strlen(s),i=j=;i<l;i++)
{
if(s[i]==' ') continue;
s[j++]=s[i];
}
l=j,s[j]='\0',temp=;
while(temp)
{
for(temp=j=i=;i<l;i++)
{
if(s[i]=='('&&s[i+]==')')
s[j++]=s[i+],i=i+,temp=;
else s[j++]=s[i];
}
l=j,s[j]='\0';
}
for(num=i=;i<l;i++)
{
if(s[i]=='(') match[i]=i,zhan[num++]=i;
else if(s[i]==')') num--,match[i]=zhan[num];
}
for(i=,temp=;i<l;i++)
{
if(s[i]=='('&&temp==) mark[i]=;
else if(s[i]==')'&&mark[match[i]]==) mark[i]=;
if(s[i]=='-') temp=;
else temp=;
}
for(i=j=;i<l;i++)
{
if(s[i]=='('&&mark[i]==) continue;
else if(s[i]==')'&&mark[i]==) continue;
s[j++]=s[i];
}
s[j]='\0';
printf("%s\n",s);
} return ;
}

ZOJ 1423 (Your)((Term)((Project))) (模拟+数据结构)的更多相关文章

  1. (Your)((Term)((Project)))

    Description You have typed the report of your term project in your personal computer. There are seve ...

  2. POJ--1690 (Your)((Term)((Project)))(字符串处理)

    (Your)((Term)((Project))) Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3353 Accepted: ...

  3. POJ 1690 (Your)((Term)((Project)))

    (Your)((Term)((Project))) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2912   Accept ...

  4. Tarjan UVALive 6511 Term Project

    题目传送门 /* 题意:第i个人选择第a[i]个人,问组成强联通分量(自己连自己也算)外还有多少零散的人 有向图强联通分量-Tarjan算法:在模板上加一个num数组,记录每个连通分量的点数,若超过1 ...

  5. UVALive 6511 Term Project

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

  6. UVALive 3486/zoj 2615 Cells(栈模拟dfs)

    这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...

  7. ZOJ 3326 An Awful Problem 模拟

    只有在 Month 和 Day 都为素数的时候才能得到糖 那就模拟一遍时间即可. //#pragma comment(linker, "/STACK:16777216") //fo ...

  8. ZOJ 2476 Total Amount 字符串模拟

    - Total Amount Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit ...

  9. ATM取款机模拟——数据结构课设

    今天帮人写的第二篇课设 . ;-) 机智的窝 要求:大概说一下吧,就是要创建一个用户(初始化一账户),模拟ATM的业务(取款,100的整数倍,改密               码,查剩余金额.等等,各 ...

随机推荐

  1. python 零散记录(一) input与raw_input 数学相关函数 转换字符串的方法

    input()与raw_input(): 两者都是接受命令行输入,但区别在于,raw_input()接受原始数据(raw data). #使用input()来提示输入名字 input("en ...

  2. ReentrantLock Condition 实现消费者生产者问题

    import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.ExecutorService; im ...

  3. zabbix邮件告警

    Zabbix邮件告警看了很多文档,写的那叫一个蛋疼,明明没有发出去邮件,硬要糊弄观众,我也跟着被糊弄. 操作系统环境: CentOS 5.5 x84_64位 Zabbix版本2.2.3 Web服务器: ...

  4. []cp,转载]提示MyEclipse Trial Expired,如何手动获取MyEclipse 注册码!很牛!

    1.建立JAVA Project,随便命名,只要符合规则就行. 2.在刚刚建好的Project右击src,新建一个类,命名为MyEclipseGen,把.java里本来有的代码全部删掉,再把下面的代码 ...

  5. Java验证码和ajax判断

    关于来了解相关的api BufferedImage(int width, int height, int imageType) 构造一个类型为预定义图像类型之一的 BufferedImage. Buf ...

  6. 探索WebKit内核(一)------ 菜鸟起步

    为什么搞WebKit 如今研究WebKit的人越来越多,俺不能免俗,也增加当中.WebKit的火爆也是得益于浏览器和WebOS的混战,随着Palm WebOS, Chrome OS, Firefox ...

  7. Test Bench基础知识笔记

    学的内容多了,好多指令和用法都容易遗忘和混淆,出现这种情况就需要勤记笔记,忘记了多翻阅几次,基本上就能完全记住了. [`timescale 1ns/1ps]前一个1ns表示时延时间,后一个1ps表示时 ...

  8. CentOS系统下做nginx和tomcat负载均衡

    系统总是频繁更新,为了避免更新系统的时候领导看不到东西,打算用ngix做代理,后台部署两个tomcat做负载均衡,避免更新一台就无法使用系统的问题,这两天看了写资料,把几个关键点记录在这里以便备忘. ...

  9. Velocity源码分析

    velocity模板渲染的步骤: 1) 首先初始化启动Velocity引擎,可以通过Velocity.init()或者新建VelocityEngine类,并调用其中的init()方法: 2) 创建一个 ...

  10. iOS内存泄漏自动检测工具PLeakSniffer

    新款objective-C内存泄漏自动检测工具 PLeakSniffer , GitHub地址 (https://github.com/music4kid/PLeakSniffer). 背景 前些天读 ...