poj2269 Friends
计算表达式。
只有3种运算符:*,+,- ,
*优先级高于后两者,后两者优先级相同。
有两种符号:{},()。
利用递归和堆栈即可解决。
首先遇到左括号开始入栈直到遇到右括号,遇到右括号时对括号内的数进行计算。
考虑到*优先级较高,因此遇到*直接对其左右集合进行运算。
最后得到不含括号和*的表达式,从左往右计算即可。
http://poj.org/problem?id=2269
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn = ;
const int maxc = ;
char buf[maxn];
int stack[maxn][maxc];
char op[maxn];
int p, k;
int vis[maxc]; void caculate(){
//meeting eol or right paren RETURN
if(buf[p] == '\0' || buf[p] == ')') return;
if(buf[p] == '('){
int k1 = k;
++p, caculate();
//guarantee that all contents in the paren computed
//figure out the current result
for(int i = k1 + ; i < k; i++){
memset(vis, , sizeof vis);
int o = op[i] == '+' ? : -;
for(int j = ; j <= stack[k1][]; j++) ++vis[stack[k1][j]];
for(int j = ; j <= stack[i][]; j++) vis[stack[i][j]] += o;
stack[k1][] = ;
for(int j = ; j < ; j++) if(vis[j] > ) stack[k1][++stack[k1][]] = j;
}
k = k1 + ;
++p, caculate();
}
else if(buf[p] == '{'){
++p;
stack[k][] = ;
for(int i = p; buf[i] != '}'; i++, ++p) stack[k][++stack[k][]] = buf[i] - 'A';
k++;
p++;
caculate();
}else if(buf[p] == '*'){
if(buf[p + ] == '(') ++p, caculate();
else if(buf[p + ] == '{'){
++p;
stack[k][] = ;
for(int i = p; buf[i] != '}'; i++, ++p) stack[k][++stack[k][]] = buf[i] - 'A';
k++;
++p;
}
//caculate stack[k - 2] * stack[k - 1] to update stack[k - 2]
memset(vis, , sizeof vis);
for(int i = ; i <= stack[k - ][]; i++) ++vis[stack[k - ][i]];
for(int i = ; i <= stack[k - ][]; i++) ++vis[stack[k - ][i]];
stack[k - ][] = ;
for(int i = ; i < ; i++) if(vis[i] == ) stack[k - ][++stack[k - ][]] = i;
--k;
caculate();
}else{
op[k] = buf[p];
++p;
caculate();
}
} void solve(){
k = p = ;
memset(vis, , sizeof );
caculate();
for(int i = ; i < k; i++){
memset(vis, , sizeof vis);
int o = op[i] == '+' ? : -;
for(int j = ; j <= stack[i - ][]; j++) ++vis[stack[i - ][j]];
for(int j = ; j <= stack[i][]; j++) vis[stack[i][j]] += o;
stack[i][] = ;
for(int j = ; j < ; j++) if(vis[j] > ) stack[i][++stack[i][]] = j;
}
putchar('{');
for(int i = ; i <= stack[k - ][]; i++) putchar(stack[k - ][i] + 'A');
putchar('}');
putchar('\n');
} int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_Judge
while(gets(buf) && buf[] != '\0') solve();
return ;
}
poj2269 Friends的更多相关文章
随机推荐
- Java基础之创建窗口——创建应用程序窗口(TryWindow)
控制台程序. 准备好应用程序窗口及其包含的组件并显示,这称为实现窗口.调用应用程序窗口对象的setVisible()方法就会实现窗口.实现了应用程序的GUI之后,在主线程中修改或查询GUI可能会导致死 ...
- 通用窗口类 Inventory Pro 2.1.2 Demo1(中)
本篇想总结的是Inventory Pro中通用窗口的具体实现,但还是要强调下该插件的重点还是装备系统而不是通用窗口系统,所以这里提到的通用窗口类其实是通用装备窗口类(其实该插件中也有非装备窗口比如No ...
- iOS 顺传
ios 顺传一层的话,直接用属性 改变里面的值 顺传穿两到三层的话 使用KVO // 设置item - (void)setItem:(UITabBarItem *)item { _item = ite ...
- m球求n盒子问题
球同盒同可空盒问题 #include <bits/stdc++.h> using namespace std; const int N = 25; int dp[N][N]; int ma ...
- SpringMvc的数据绑定流程
在SpringMvc中会将来自web页面的请求和响应数据与controller中对应的处理方法的入参进行绑定,即数据绑定.流程如下: -1.SpringMvc主框架将ServletRequest对象及 ...
- 变形--旋转 rotate()
旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点中心顺时针旋转:如果这个值为负值,元素相 ...
- mac office
弄了个office2016正式版的教程,大多数朋友表示搞不懂,SO重新写了个超级详细的,在不懂我也是醉了.Mac office 2016免费安装教程微软近日正式向 Office 365 订阅用户发布了 ...
- 深入剖析PHP输入流 php://input (转载 http://www.nowamagic.net/academy/detail/12220520)
http://www.nowamagic.net/academy/detail/12220520
- Linux 安装 nginx注意
./configure --prefix=/usr/local/nginx TO ./configure --prefix=/usr/local/nginx --conf-path=/usr/loca ...
- python 笔记1
Python join()方法 描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str.join(sequence) 参数 ...