ZOJ 1423 (Your)((Term)((Project))) (模拟+数据结构)
题目链接: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))) (模拟+数据结构)相关推荐
- UVALive 6511 Term Project
Term Project Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origi ...
- 算法模版:模拟数据结构之绪论【沈七】
算法模版:模拟数据结构之绪论 前言 什么是数据结构? 先看数据 再看结构 一些术语 逻辑结构 储存结构 完结散花 参考文献 前言 唤我沈七就好. 算下来应该是有两周没更新了. 是因为最近一直在研究数据 ...
- qu(判定操作序列)NOIP模拟 数据结构判断 模拟
[问题描述] 给你一个操作序列,问这个维护操作序列的数据结构是哪一种? [输入格式] 第一行是一个正整数?代表操作数目. 接下来?行,每行两个正整数???, ?.如果??? = 1,代表我们将?加入数 ...
- aov建立Java模拟,数据结构之---C语言实现拓扑排序AOV图
//有向图的拓扑排序 //杨鑫 #include #include #include #define MAX_NAME 3 #define MAX_VERTEX_NUM 20 typedef int ...
- 【ZOJ - 3946】Highway Project(最短路子图,维护双权值,贪心,最小树形图)
题干: Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he ...
- 一维数组模拟数据结构-------栈
1.用一维数据模拟栈结构 public class Stack1{//一维数据模拟栈结构 Object[] elements;//默认栈的容量为5public Stack1(){this(5); // ...
- 2018青岛ICPC ZOJ 4061: Magic Multiplication(模拟)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意: 定义一种新型运算符: 也就是说Gao(23, 45 ...
- 电梯模拟 数据结构课设
代码: https://download.csdn.net/download/TYtrack/19384997 报告: https://download.csdn.net/download/TYtra ...
- 【zoj 3547】【zoj 3548】8.17模拟赛
题目来源:未知,zoj3547,3548 t1 [问题描述] 若干年之后,XJH找工作面试,面试官给了他这样一个题目. 你有一个N*N的回型矩阵,保证N是奇数. 例如,当N=5的时候,矩阵如下: 现在 ...
最新文章
- SharePoint 2013的100个新功能之网站管理(二)
- Ajax请求中的async:false/true的作用
- Ant Design Vue select下拉列表设置默认值
- Request_原理
- 实现一个MVVM和promise
- 如何启用SAP Cloud Platform的mobile服务
- ad中电容用什么封装_二极管在电路中到底做什么用的
- toj 4613 Number of Battlefields
- Netty实战——Channel、EventLoop和ChannelFuture详解
- getTime()的兼容性(ios)
- android三国2,三国演义2单机版安卓
- cc2500的SPI
- fw150r虚拟服务器设置,迅捷 FW150R 无线路由器端口映射设置指南
- 每秒浮点运算次数FLOPS
- 计算机电子贺卡制作圣诞节,圣诞电子贺卡制作方法
- 结构化数据、半结构化数据、非结构化数据的对比
- Hadoop2.0高可用集群搭建【保姆级教程】
- FITC-Dextran,Dextran-FITC,右旋糖酐荧光素,一种被标记的多糖
- access与trunk详细解析+区别
- 错误:can‘t create 事务 lock on /var/lib/rpm/.rpm.lock (只读文件系统)