题目描述 Description

对于 加、减、乘、除这种四则运算的表达式,我们使用的是先乘除、后加减的从左到右的顺序进行运算,如果要指定特定的顺序,就要增加括号进行表达,比如 (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*+

输入描述 Input Description

输入包含一行,50个字符以内,代表普通表达式

输出描述 Output Description

输出包含一行,代表转换后的波兰表达式

样例输入 Sample Input

(A-B)*C+D*E

样例输出 Sample Output

AB-C*DE*+

数据范围及提示 Data Size & Hint

输入包含一行,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 波兰表达式的更多相关文章

  1. [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  2. AC日记——逆波兰表达式 openjudge 3.3 1696

    1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...

  3. noi1696 逆波兰表达式

    1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...

  4. codevs5164 逆波兰表达式

    题目描述 Description 逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也 ...

  5. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  6. SDIBT2666——逆波兰表达式求值

    逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...

  7. OpenJudge 2694 逆波兰表达式

    1.链接地址: http://bailian.openjudge.cn/practice/2694/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算 ...

  8. 逆波兰表达式 java

    描述  逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序,例如(2 + 3) ...

  9. c++实现将表达式转换为逆波兰表达式

    https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...

随机推荐

  1. RabbitMQ配置文件

    配置文件Config 在Web的可视化管理界面中可以看到一些文件的路径 比如 Config文件的地址 数据库存放的文件夹 log文件的地址 进入到这个文件夹会发现有这些文件,其中example是con ...

  2. MOOCULUS微积分-2: 数列与级数学习笔记 6. Power series

    此课程(MOOCULUS-2 "Sequences and Series")由Ohio State University于2014年在Coursera平台讲授. PDF格式教材下载 ...

  3. python中join和split函数

    一个是分割,一个是连接. 惯例,先看内部帮助文档 Help on method_descriptor: join(...) S.join(iterable) -> string Return a ...

  4. oracle修改表字段名时报错:ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效的问题

    打开sql plus select session_id from v$locked_object;查询出oracle锁定的会话ID SELECT sid, serial#, username, os ...

  5. javascript 代码可读性

    可读性的大部分内容都是和代码缩进相关的,必须保证代码有良好的格式.可读性的另一方面就是注释,一般而言,有如下一些地方需要进行注释 1.1.1 函数和方法 每个函数或方法都应该包含一个注释,描述其目的和 ...

  6. 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 ...

  7. DiskFileItemFactory类

    将请求消息实体中的每一个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务由 org.apache.commons.fileupload.FileItemFactor ...

  8. sql总结一

    建表: select * from fruit; create table fruit ( id varchar(10) not null, name varchar(20) default '' n ...

  9. JS-流程控制汇集

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>流 ...

  10. JavaScript中的变量及数据类型

    转自:http://blog.csdn.net/mygis2005/article/details/7375419 JavaScript是一种弱类型的语言,变量名.操作符和方法名都区分大小写. 1.变 ...