UVALive 2056 Lazy Math Instructor(递归处理嵌套括号)
因为这个题目说明了优先级的规定,所以可以从左到右直接运算,在处理嵌套括号的时候,可以使用递归的方法,给定每一个括号的左右边界,伪代码如下:
int Cal(){
if(括号) sum += Cal();
else sum += num;
return sum;
}
但是这个题目着实坑了我一下,见过WA了,没见过TLE呢……我因为没有看到有空格这个条件,无线TLE,又是消除函数又是改用数组模拟栈,其实就是读入出错和忘记了处理空格,改了之后,成功AC了。代码如下:
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
#define maxn 100
int pos[maxn],st[maxn];
int Cal(int id,const char *a){
int sum = ,tmp;
for(int i = id+;i < pos[id];i++){
if(a[i] == '('){
tmp = Cal(i,a);
if(a[i-]=='(' || a[i-]=='+') sum += tmp;
else if(a[i-]=='-') sum -= tmp;
else if(a[i-]=='*') sum *= tmp;
i = pos[i];
}
else if((a[i]>='a'&&a[i]<='z')||(a[i]>=''&&a[i]<='')){
if(a[i]>='a'&&a[i]<='z') tmp = (a[i]-'a'+);
else tmp = a[i]-'';
if(a[i-]=='(' || a[i-]=='+') sum += tmp;
else if(a[i-]=='-') sum -= tmp;
else if(a[i-]=='*') sum *= tmp;
i++;
}
}
return sum;
}
int getnum(const char *a){
memset(pos,,sizeof(pos));
memset(st,,sizeof(st));
int len = strlen(a);
int top = ;
for(int i = ;i < len;i++)
{
if(a[i]=='(') st[top++] = i;
if(a[i]==')') {
pos[st[--top]] = i;
}
}
int sum = ,tmp;
for(int i = ;i < len;i++){
if(a[i]=='('){
tmp = Cal(i,a);
if(i == || a[i-]=='+')
sum += tmp;
else if(a[i-] == '-') sum -= tmp;
else if(a[i-] == '*') sum *= tmp;
i = pos[i];
}
else if((a[i]>='a'&&a[i]<='z')||(a[i]>=''&&a[i]<='')){
if(a[i]>='a'&&a[i]<='z') tmp = (a[i]-'a'+);
else tmp = a[i]-'';
if(i == || a[i-]=='+')
sum += tmp;
else if(a[i-] == '-') sum -= tmp;
else sum *= tmp;
i++;
}
}
//printf("the num = %d\n",sum);
return sum;
}
int main()
{
int t,lena,lenb,num1,num2,tot;
char a[maxn],b[maxn];
scanf("%d",&t);
getchar();
while(t--){
gets(a);
lena = strlen(a);
tot = ;
for(int i = ;i < lena;i++){
if(a[i]==' ') continue;
else b[tot++] = a[i];
}
b[tot] = '\0';
num1 = getnum(b);
gets(a);
lena = strlen(a);
tot = ;
for(int i = ;i < lena;i++){
if(a[i]==' ') continue;
else b[tot++] = a[i];
}
b[tot] = '\0';
num2 = getnum(b);
if(num1 == num2) puts("YES");
else puts("NO");
}
return ;
}
最新文章
- 如何在 TFS 中使用 Git
- js晋级篇——前端内存泄漏探讨
- Ajax中Get请求与Post请求的区别
- Leetcode--Swap Nodes in Pairs
- EF快速开发定义数据接口类(转)
- 从零开始学习Node.js例子三 图片上传和显示
- iOS 处理多个网络请求的并发的情况
- [Flex] PopUpButton系列 —— 添加按钮图标
- ExtJs4学习MVC中的Store
- C语言char[]和char*比较
- SQL语句之二建表
- UVA 10943 How do you add?
- HOWTO: 为GitHub for Windows指定代理服务器(转)
- .Net程序员学用Oracle系列(1):导航目录
- 基于 Spring MVC 的开源测试用例管理系统以及开发自测的实践
- CentOS安装node.js-8.11.1+替换淘宝NPM镜像
- 为CCB中的Sprite子类化CCSprite的一个问题
- js限制字符串长度,超出的部分补...
- 用matlab生成mif文件
- Java中的ReentrantLock和synchronized两种锁定
热门文章
- hdu 1407 测试你是否和LTC水平一样高
- JQuery 阻止事件冒泡
- amazeui tab 监听当前选项
- python 信用卡系统+购物商城见解
- shell 之awk 关联数组高级应用
- Developing a Custom Membership Provider from the scratch, and using it in the FBA (Form Based Authentication) in SharePoint 2010
- SharePoint 2013 列表启用搜索
- Git 的 .gitignore 配置 转载
- Edit Individual GridView Cells in ASP.NET
- mib.c