题目描述 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. [Objective-C 面试简要笔记]

    Obj-C: 1.消息机制 [shape draw]  向该对象发送消息,该对象查找并运行此函数 差不多就是shape.draw(); 2.中缀语法 [textThing setStringValue ...

  2. 开发一个jQuery插件——多级联动菜单

    引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...

  3. class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class

    今天在工作中遇到了下面的问题: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springfram ...

  4. Ubuntu 之 Personal Package Archive (PPA)

    How do I use software from a PPA? To start installing and using software from a Personal Package Arc ...

  5. 墙内无缝更新Android SDK

    https://www.caoqq.net/android-sdk-offine-download.html Lucas · 10 个月前 打开Android SDK Manager, 打开设置 2. ...

  6. DIY(码表)制作实验

    代码: #include<reg52.h>typedef unsigned char u8;typedef unsigned int  u16;/********端口定义********* ...

  7. Java 毫秒转换为日期类型、日期转换为毫秒

    /毫秒转换为日期 public static void main(String[] args) { DateFormat formatter = new SimpleDateFormat(" ...

  8. SVM基本思想和对偶推导笔记-记录毕业论文1

    快毕业啦~~记得上一篇论文利用JointBoost+CRF做手绘草图的分割项目在3月份完结后,6月份去实习,9月份也没怎么认真找工作就立刻回来赶论文(由于分割项目与人合作难以写入毕业论文),从9月到1 ...

  9. redis主从复制操作

    1. 33.10服务器上 启动三个redis bin/redis-server etc/redis.conf bin/redis-server etc/6380conf bin/redis-serve ...

  10. Jquery 实现密码框的显示与隐藏【转载自http://blog.csdn.net/fengzhishangsky/article/details/11809069】

    <html> <head>  <script type="text/JavaScript"  src="jQuery-1.5.1.min.j ...