codevs2574 波兰表达式
对于 加、减、乘、除这种四则运算的表达式,我们使用的是先乘除、后加减的从左到右的顺序进行运算,如果要指定特定的顺序,就要增加括号进行表达,比如 (A+B)*C , A+(F-(A+Y))*(B-C)/D 。
除了上述表达方式之外,在1929年,波兰逻辑学家Lukasiewicz提出一种不用括号的逻辑符号体系,后来人们称之为波兰表示法,波兰表达式的特点是运算符位于运算对象的后面,因此称为后缀表示。在对波兰表达式进行运算,严格按照自左至右的顺序进行。下面给出一些表达式及其相应的波兰表达式。
|
普通表达式 |
波兰表达式 |
|
A-B |
AB- |
|
(A-B)*C+D |
AB-C*D+ |
|
(B+C)/(A-D) |
BC+AD-/ |
【普通表达式】
普通表达式 (EXP) 定义如下:
1、 大写字母 A,B,C,D …Z 是 EXP
2、 EXP+EXP , EXP–EXP , EXP*EXP , EXP/EXP 是EXP
3、 (EXP) 是EXP
普通表达式使用习惯性的括号优先。先乘除后加减的顺序进行运算。
【普通表达式转换成波兰表达式】
普通表达式可以按照运算顺序构建二叉树然后转换成波兰表达式。
例如:
(A-B)*C+D*E
对应的运算二叉树如下:

然后对该二叉树进行后序遍历,就可以得到波兰表达式: AB-C*DE*+
输入包含一行,50个字符以内,代表普通表达式
输出包含一行,代表转换后的波兰表达式
(A-B)*C+D*E
AB-C*DE*+
输入包含一行,50个字符以内
/*
简单的表达式分析
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define ll int
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
using namespace std;
const int maxn = ;
ll read(){
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
char s[maxn],bo[maxn];
int cnt,rt;
struct exp_t{
int lch[maxn],rch[maxn];
char op[maxn];
int nc;
void cler(){
memset(lch,,sizeof(lch));
memset(rch,,sizeof(rch));
nc = ;
}
int build(int l,int r){
int c1 = -,c2 = -,p=;
int u;
if(l == r){
u = ++nc;
lch[u] = rch[u] = ;
op[u] = s[l];
return u;
}
fo(i,l,r){
switch(s[i]){
case '(':p++;break;
case ')':p--;break;
case '+':case '-':if(!p) c1 = i;break;
case '*':case '/':if(!p) c2 = i;break;
}
}
if(c1 < ) c1 = c2;
if(c1 < ) return build(l+,r-);
u = ++nc;
lch[u] = build(l,c1-);
rch[u] = build(c1+,r);
op[u] = s[c1];
return u;
}
void dfs(int x){
if(lch[x]) dfs(lch[x]);
if(rch[x]) dfs(rch[x]);
bo[++cnt] = op[x];
}
void get_b(){
cnt = ;
dfs(rt);
}
}e;
int main(){
scanf("%s",s+);
e.cler();
rt = e.build(,strlen(s+));
e.get_b();
fo(i,,cnt) cout<<bo[i];
return ;
}
codevs2574 波兰表达式的更多相关文章
- [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- AC日记——逆波兰表达式 openjudge 3.3 1696
1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...
- noi1696 逆波兰表达式
1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...
- codevs5164 逆波兰表达式
题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- SDIBT2666——逆波兰表达式求值
逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...
- OpenJudge 2694 逆波兰表达式
1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...
- 逆波兰表达式 java
描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序,例如(2 + 3) ...
- c++实现将表达式转换为逆波兰表达式
https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...
随机推荐
- RabbitMQ配置文件
配置文件Config 在Web的可视化管理界面中可以看到一些文件的路径 比如 Config文件的地址 数据库存放的文件夹 log文件的地址 进入到这个文件夹会发现有这些文件,其中example是con ...
- MOOCULUS微积分-2: 数列与级数学习笔记 6. Power series
此课程(MOOCULUS-2 "Sequences and Series")由Ohio State University于2014年在Coursera平台讲授. PDF格式教材下载 ...
- python中join和split函数
一个是分割,一个是连接. 惯例,先看内部帮助文档 Help on method_descriptor: join(...) S.join(iterable) -> string Return a ...
- oracle修改表字段名时报错:ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效的问题
打开sql plus select session_id from v$locked_object;查询出oracle锁定的会话ID SELECT sid, serial#, username, os ...
- javascript 代码可读性
可读性的大部分内容都是和代码缩进相关的,必须保证代码有良好的格式.可读性的另一方面就是注释,一般而言,有如下一些地方需要进行注释 1.1.1 函数和方法 每个函数或方法都应该包含一个注释,描述其目的和 ...
- HDU5671Matrix(矩阵行列交换)
有一个nn行mm列的矩阵(1 \leq n \leq 1000 ,1 \leq m \leq 1000 )(1≤n≤1000,1≤m≤1000),在这个矩阵上进行qq (1 \leq q \leq 1 ...
- DiskFileItemFactory类
将请求消息实体中的每一个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务由 org.apache.commons.fileupload.FileItemFactor ...
- sql总结一
建表: select * from fruit; create table fruit ( id varchar(10) not null, name varchar(20) default '' n ...
- JS-流程控制汇集
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>流 ...
- JavaScript中的变量及数据类型
转自:http://blog.csdn.net/mygis2005/article/details/7375419 JavaScript是一种弱类型的语言,变量名.操作符和方法名都区分大小写. 1.变 ...