P1175 表达式的转换

思路:先用栈转成中缀表达式,再用栈进行计算。要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back)。虽然表达式求值也可以这么做,但是还是直接做比较简单。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. unordered_map<char,int>mp;
  4. int calc(int a,int b,char opt) {
  5. if(opt=='+')return a+b;
  6. if(opt=='-')return a-b;
  7. if(opt=='*')return a*b;
  8. if(opt=='/')return a/b;
  9. if(opt=='^')return pow(a,b);
  10. }
  11. string s;
  12. bool isd(char c){return (c>='0'&&c<='9');}
  13. string change(string s)
  14. {
  15. stack<char>st;
  16. string res="";
  17. int len=s.length();
  18. for(int i=0;i<len;++i)
  19. {
  20. if(isd(s[i]))res+=s[i];
  21. else if(s[i]=='(')st.push(s[i]);
  22. else if(s[i]==')')
  23. {
  24. while(!st.empty()&&st.top()!='(')
  25. res+=st.top(),st.pop();
  26. st.pop();
  27. }
  28. else
  29. {
  30. while(!st.empty()&&mp[st.top()]>=mp[s[i]])
  31. res+=st.top(),st.pop();
  32. st.push(s[i]);
  33. }
  34. }
  35. while(!st.empty())res+=st.top(),st.pop();
  36. return res;
  37. }
  38. void print(string s)
  39. {
  40. int len=s.length();
  41. for(int i=0;i<len;++i)
  42. printf("%c ",s[i]);
  43. puts("");
  44. }
  45. void solve(string s)
  46. {
  47. print(s);
  48. vector<int>v;
  49. int len=s.length();
  50. for(int i=0;i<len;++i)
  51. {
  52. if(isd(s[i]))v.push_back(s[i]-'0');
  53. else
  54. {
  55. int x=v.back();v.pop_back();
  56. int y=v.back();v.pop_back();
  57. v.push_back(calc(y,x,s[i]));
  58. for(int j=0;j<v.size();++j)printf("%d ",v[j]);
  59. for(int j=i+1;j<len;++j)printf("%c ",s[j]);
  60. puts("");
  61. }
  62. }
  63. }
  64. int main()
  65. {
  66. mp['(']=mp[')']=0;mp['+']=mp['-']=1;mp['*']=mp['/']=2;mp['^']=3;
  67. cin>>s;
  68. s=change(s);
  69. solve(s);
  70. return 0;
  71. }

中后缀表达式/洛谷P1175 表达式的转换的更多相关文章

  1. 洛谷P1175 表达式的转换

    P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...

  2. 洛谷P1017 进制转换

    洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...

  3. 洛谷p1017 进制转换(2000noip提高组)

    洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...

  4. 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用

    题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...

  5. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  6. 洛谷P1310 表达式的值——题解

    题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...

  7. 洛谷 P1017 进制转换

    推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...

  8. 洛谷P1981 表达式求值 题解 栈/中缀转后缀

    题目链接:https://www.luogu.org/problem/P1981 这道题目就是一道简化的中缀转后缀,因为这里比较简单,只有加号(+)和乘号(*),所以我们只需要开一个存放数值的栈就可以 ...

  9. 洛谷 P1310 表达式的值 解题报告

    P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...

随机推荐

  1. elasticsearch kibana logstash(ELK)的安装集成应用

    官网关于kibana的学习指导网址是:https://www.elastic.co/guide/en/kibana/current/index.html Kibana是一个开源的分析和可视化平台,设计 ...

  2. R语言 方差稳定化变换与线性变换 《回归分析与线性统计模型》page96

    > rm(list = ls()) > A=read.csv("data96.csv") > A Y N 1 11 0.0950 2 7 0.1920 3 7 0 ...

  3. Vmware 和 VisualSVN-Server端口冲突

    安装 VisualSVN-Server 时,发现他和 Vmware   在端口  443 冲突: 先把本地自启动的 Vmware 全部停止,并改成手工启动服务: 这样可以节省资源,再安装 svn服务时 ...

  4. Python Sphinx使用踩坑记录

    描述 使用 pip 安装sphinx后,按照教程建立了一个新的py文件,如下 # run.py def run(name): """ this is how we run ...

  5. 023、Java中String的用法

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  6. spark sortShuffleWriter源码学习

    查看的源码为spark2.3 调用ShuffleMapTask的runTask方法 org.apache.spark.scheduler.ShuffleMapTask#runTask ShuffleM ...

  7. JAVA学习笔记-数组的三种初始化方式

      package Study; public class TestArray02 { public static void main(String[] args){//声明 int[] a; int ...

  8. HDU - 6205 card card card (尺取法)

    题意:有n堆牌,ai表示每堆牌的牌数,bi表示每堆牌的penaltyvalue,操作开始前,可以重复进行将第一堆牌挪到最后一堆这一操作.然后,对于挪完后的牌,从第一堆开始,依次取.对于每一堆牌,首先将 ...

  9. Sublime和Python中文编码的一些问题

    Windows下的控制台中,应该是这样的逻辑: 1.如果是Unicode字符串的话,首先根据控制台编码进行转换 2.之后进行输出 所以在Windows控制台下,假设str = u'中文', 1.直接p ...

  10. bzoj 1912: [Apio2010]patrol 巡逻

    呵呵呵呵呵呵,自己画图,大概半个小时,觉的连上边会成环(是不是该交仙人掌了??)然后求环不重合部分最大就好了, 结果写了一坨DP,最后写不下去了,再次扒了题解. 发现我真的是个sb. k==1,直接是 ...