中后缀表达式/洛谷P1175 表达式的转换
思路:先用栈转成中缀表达式,再用栈进行计算。要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back)。虽然表达式求值也可以这么做,但是还是直接做比较简单。
#include<bits/stdc++.h>
using namespace std;
unordered_map<char,int>mp;
int calc(int a,int b,char opt) {
if(opt=='+')return a+b;
if(opt=='-')return a-b;
if(opt=='*')return a*b;
if(opt=='/')return a/b;
if(opt=='^')return pow(a,b);
}
string s;
bool isd(char c){return (c>='0'&&c<='9');}
string change(string s)
{
stack<char>st;
string res="";
int len=s.length();
for(int i=0;i<len;++i)
{
if(isd(s[i]))res+=s[i];
else if(s[i]=='(')st.push(s[i]);
else if(s[i]==')')
{
while(!st.empty()&&st.top()!='(')
res+=st.top(),st.pop();
st.pop();
}
else
{
while(!st.empty()&&mp[st.top()]>=mp[s[i]])
res+=st.top(),st.pop();
st.push(s[i]);
}
}
while(!st.empty())res+=st.top(),st.pop();
return res;
}
void print(string s)
{
int len=s.length();
for(int i=0;i<len;++i)
printf("%c ",s[i]);
puts("");
}
void solve(string s)
{
print(s);
vector<int>v;
int len=s.length();
for(int i=0;i<len;++i)
{
if(isd(s[i]))v.push_back(s[i]-'0');
else
{
int x=v.back();v.pop_back();
int y=v.back();v.pop_back();
v.push_back(calc(y,x,s[i]));
for(int j=0;j<v.size();++j)printf("%d ",v[j]);
for(int j=i+1;j<len;++j)printf("%c ",s[j]);
puts("");
}
}
}
int main()
{
mp['(']=mp[')']=0;mp['+']=mp['-']=1;mp['*']=mp['/']=2;mp['^']=3;
cin>>s;
s=change(s);
solve(s);
return 0;
}
中后缀表达式/洛谷P1175 表达式的转换的更多相关文章
- 洛谷P1175 表达式的转换
P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...
- 洛谷P1017 进制转换
洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...
- 洛谷p1017 进制转换(2000noip提高组)
洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 洛谷P1310 表达式的值——题解
题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...
- 洛谷 P1017 进制转换
推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...
- 洛谷P1981 表达式求值 题解 栈/中缀转后缀
题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...
- 洛谷 P1310 表达式的值 解题报告
P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...
随机推荐
- bsearch的使用
懒得写二分查找,结果发现stdlib里自带了二分查找. C 库函数 void *bsearch(const void *key, const void *base, size_t nitems, si ...
- flutter如何使用配置文件pubspec.yaml(位于项目根目录)来管理第三方依赖包
官方文档 在软件开发中,很多时候有一些公共的库或SDK可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率.很多编程语言或开发工具 ...
- C++中数字与字符串之间的转换 scanf string总结(复习必读)
1 string的scanf读入操作 C++里面控制台输入直接使用cin操作就可以了:或者getline(istringstream,string); 字符和数字加减就是字符的ASCII码和数字直接加 ...
- 赶在EW2020之前,FreeRTOS发布V10.3.0,将推出首个LTS版本
点击下载:FreeRTOSv10.3.0.exe 说明: 1.新版更新: (1)对于IAR For RISC-V进行支持,并且加强了对RISC-V内核芯片支持,做了多处修正. (2)对阿里平头哥CH2 ...
- 034、Java中自增之++在前面的写法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 机器学习-liuyubobobo(慕课网)
第一章 python3玩转机器学习 第二章 机器学习基础 安装:1.anaconda 2.pycharm 第三章 Jupyter Notebook,numpy,Matplotlib 1.jupyt ...
- hadoop ozone入门
简介 众所周知,HDFS是大数据存储系统,并在业界得到了广泛的使用.但是无论大集群还是小集群其扩展性都受NameNode的限制,虽然HDFS可以通过Federation进行扩展,但是依然深受小文件和4 ...
- python中groupby函数详解(非常容易懂)
一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...
- svn全局设置过滤文件没有作用的解决办法
svn全局设置过滤文件,网上教程文章很多, 都说了怎么配置,没有强调配置内容的格式 导致用惯了git的人,上手配置后,不起作用. 下面是我的配置内容: .classpath .project .set ...
- B. Misha and Changing Handles
B. Misha and Changing Handles time limit per test 1 second memory limit per test 256 megabytes input ...