题目描述 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 = 1050;
ll read(){ll x=0,f=1;char ch=getchar();while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();};while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');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,0,sizeof(lch));memset(rch,0,sizeof(rch));nc = 0;}int build(int l,int r){int c1 = -1,c2 = -1,p=0;int u;if(l == r){u = ++nc;lch[u] = rch[u] = 0;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 < 0) c1 = c2;if(c1 < 0) return build(l+1,r-1);u = ++nc;lch[u] = build(l,c1-1);rch[u] = build(c1+1,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 = 0;dfs(rt);}
}e;
int main(){scanf("%s",s+1);e.cler();rt = e.build(1,strlen(s+1));e.get_b();fo(i,1,cnt) cout<<bo[i];return 0;
} 

转载于:https://www.cnblogs.com/hyfer/p/6002820.html

codevs2574 波兰表达式相关推荐

  1. LeetCode实战:逆波兰表达式求值

    题目英文 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...

  2. 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)

    题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...

  3. 数据结构:后缀表达式(逆波兰表达式)

    逆波兰表达式计算 package com.atchina.stack;import java.util.ArrayList; import java.util.List; import java.ut ...

  4. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  5. LetCode: 150. 逆波兰表达式求值

    提示 LintCode中的相关算法题实现代码,可以在我的GithHub中下载. 题目需求 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另 ...

  6. Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)

    Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...

  7. 简单计算器 逆波兰表达式

    问题 C: 悠派计算器 时间限制: 1 Sec  内存限制: 128 MB 提交: 7  解决: 2 [提交][状态][讨论版][命题人:qianyouyou] 题目描述 yoyo的小老弟小渣渣灰特别 ...

  8. 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

  9. 逆波兰表达式简单介绍

    逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的 ...

最新文章

  1. 如何重装Domino服务器或者将Domino服务器从一台机器迁移到另外一台
  2. Matlab移植到Eigen用到的词条
  3. C++socket编程(三):3.5 accept读取用户的连接信息
  4. 20151217jqueryUI--自动补全工具
  5. java 下载管理_Java多线程文件下载管理器详解
  6. 70. 命名空间 与 自动加载
  7. mysql upsert语法_mysql – SQL标准UPSERT调用
  8. Synchronized的锁优化,kotlin中文文档pdf
  9. MySQL 数据类型转化
  10. 英威腾GD200A系列变频器实现多段速控制的相关参数设置及接线
  11. 37 岁老码农找工作,现身说法...
  12. C#利用HttpClient获取微信Web扫描登录二维码
  13. 微信支付宝付款码规则
  14. 应用软件安装后在注册表中生成的安装信息、卸载信息
  15. HTML5期末大作业:南京旅游网站设计——六朝古都-南京旅游(10页) HTML+CSS+JavaScript 出游旅游主题度假酒店 计划出行网站设计
  16. 数据结构与算法 | 青岛大学 | 王卓
  17. java cstring_CString 操作指南
  18. JS中将中文数字转化为阿拉伯数字
  19. 工具 - 分解TexturePacker导出的大图
  20. 人工智能能和人类辩论了;《云网产业发展白皮书》发布

热门文章

  1. android-async-http 源码分析
  2. MXNet设计和实现简介
  3. Android APP终极瘦身指南
  4. Android dex分包方案 (多dex)
  5. python里compile的作用_Python代码中compile()函数具有哪些功能呢?
  6. JZOJ 5483. 【清华集训2017模拟11.26】简单路径
  7. Java连接open fire_java – 为什么我不能连接到openfire服务器?
  8. iphone导出照片到电脑_iphone照片导入电脑的方法
  9. BZOJ-2002-Bounce弹飞绵羊-分块
  10. [USACO14JAN]记录奥林比克