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 = 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 波兰表达式相关推荐
- LeetCode实战:逆波兰表达式求值
题目英文 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...
- 【Java】LeetCode 150. 逆波兰表达式求值 (后缀表达式)
题目: 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话 ...
- 数据结构:后缀表达式(逆波兰表达式)
逆波兰表达式计算 package com.atchina.stack;import java.util.ArrayList; import java.util.List; import java.ut ...
- 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)
前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4 对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...
- LetCode: 150. 逆波兰表达式求值
提示 LintCode中的相关算法题实现代码,可以在我的GithHub中下载. 题目需求 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另 ...
- Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)
Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...
- 简单计算器 逆波兰表达式
问题 C: 悠派计算器 时间限制: 1 Sec 内存限制: 128 MB 提交: 7 解决: 2 [提交][状态][讨论版][命题人:qianyouyou] 题目描述 yoyo的小老弟小渣渣灰特别 ...
- 【栈】【150. 逆波兰表达式求值】【中等】(需回顾)
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
- 逆波兰表达式简单介绍
逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的 ...
最新文章
- 如何重装Domino服务器或者将Domino服务器从一台机器迁移到另外一台
- Matlab移植到Eigen用到的词条
- C++socket编程(三):3.5 accept读取用户的连接信息
- 20151217jqueryUI--自动补全工具
- java 下载管理_Java多线程文件下载管理器详解
- 70. 命名空间 与 自动加载
- mysql upsert语法_mysql – SQL标准UPSERT调用
- Synchronized的锁优化,kotlin中文文档pdf
- MySQL 数据类型转化
- 英威腾GD200A系列变频器实现多段速控制的相关参数设置及接线
- 37 岁老码农找工作,现身说法...
- C#利用HttpClient获取微信Web扫描登录二维码
- 微信支付宝付款码规则
- 应用软件安装后在注册表中生成的安装信息、卸载信息
- HTML5期末大作业:南京旅游网站设计——六朝古都-南京旅游(10页) HTML+CSS+JavaScript 出游旅游主题度假酒店 计划出行网站设计
- 数据结构与算法 | 青岛大学 | 王卓
- java cstring_CString 操作指南
- JS中将中文数字转化为阿拉伯数字
- 工具 - 分解TexturePacker导出的大图
- 人工智能能和人类辩论了;《云网产业发展白皮书》发布
热门文章
- android-async-http 源码分析
- MXNet设计和实现简介
- Android APP终极瘦身指南
- Android dex分包方案 (多dex)
- python里compile的作用_Python代码中compile()函数具有哪些功能呢?
- JZOJ 5483. 【清华集训2017模拟11.26】简单路径
- Java连接open fire_java – 为什么我不能连接到openfire服务器?
- iphone导出照片到电脑_iphone照片导入电脑的方法
- BZOJ-2002-Bounce弹飞绵羊-分块
- [USACO14JAN]记录奥林比克