题目描述

输入一个字符串形式的表达式,该表达式中包括整数,四则运算符(+、-、*、/),括号,三角函数(sin(x)、cos(x)、tan(x)),底数函数(lg(x)、ln(x)),计算该表达式的值

输入

输入一个字符串形式的表达式,保证中间及最终结果不超出double的范围

 

输出

表达式的值,保留6位小数

样例输入

  1. 3
  2. 3+5
  3. ((2-1)*5-1)*6
  4. 1+cos(0)

样例输出

  1. 3.000000
  2. 8.000000
  3. 24.000000
  4. 2.000000

来源

2015机考D题

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<string>
  5. #include<stack>
  6. using namespace std;
  7. int main()
  8. {
  9. string str;
  10. while(cin>>str)
  11. {
  12. stack<double>num;
  13. stack<char>chr;
  14. for(int i=;i<str.size();i++)
  15. {
  16. //cout<<str[i]<<" ";
  17. double number=;
  18. if(str[i]>=&&str[i]<=)
  19. {
  20. number=str[i]-;
  21. while(str[i+]>=&&str[i+]<=)
  22. {
  23. number=number*+(str[i+]-);
  24. i++;
  25. }
  26. num.push(number);
  27. }
  28. else if(str[i]=='(')
  29. chr.push(str[i]);
  30. else if(str[i]=='+'||str[i]=='-')
  31. chr.push(str[i]);
  32. else if(str[i]=='*'||str[i]=='/')
  33. {
  34. char t=str[i];
  35. i++;
  36. number=str[i]-;
  37. while(str[i+]>=&&str[i+]<=)
  38. {
  39. number=number*+(str[i+]-);
  40. i++;
  41. }
  42. num.push(number);
  43. double x=num.top();num.pop();
  44. double y=num.top();num.pop();
  45. double n=;
  46. if(t=='*')
  47. n=x*y;
  48. else n=x/y;
  49. num.push(n);
  50. }
  51. else if(str[i]==')')
  52. {
  53. char temp=chr.top();chr.pop();
  54. double x=num.top();num.pop();
  55. double y=num.top();num.pop();
  56. double n=;
  57. if(temp=='+')
  58. n=x+y;
  59. else if(temp=='-')
  60. n=y-x;
  61. num.push(n);
  62. chr.pop();
  63. chr.pop();
  64. }
  65. else if(str[i]=='s'||str[i]=='c'||str[i]=='t')
  66. {
  67. char t=str[i];
  68. i=i+;
  69. number=str[i]-;
  70. while(str[i+]>=&&str[i+]<=)
  71. {
  72. number=number*+(str[i+]-);
  73. i++;
  74. }
  75. if(t=='s')
  76. {
  77. number=sin(number);
  78. num.push(number);
  79. }
  80. else if(t=='t')
  81. {
  82. number=tan(number);
  83. num.push(number);
  84. }
  85. else if(t=='c')
  86. {
  87. number=cos(number);
  88. num.push(number);
  89. }
  90. i++;
  91. }
  92. else if(str[i]=='l')
  93. {
  94. char t=str[i+];
  95. i=i+;
  96. number=str[i]-;
  97. while(str[i+]>=&&str[i+]<=)
  98. {
  99. number=number*+(str[i+]-);
  100. i++;
  101. }
  102. if(t=='g')
  103. {
  104. number=log10(number);
  105. num.push(number);
  106. }
  107. else if(t=='n')
  108. {
  109. number=log(number);
  110. num.push(number);
  111. }
  112. i++;
  113. }
  114. }
  115. while(chr.size()>&&chr.size()<&&num.size()!=)
  116. {
  117. char temp=chr.top();chr.pop();
  118. double x=num.top();num.pop();
  119. double y=num.top();num.pop();
  120. double n=;
  121. if(temp=='+')
  122. n=x+y;
  123. else if(temp=='-')
  124. n=y-x;
  125. else if(temp=='(')
  126. continue;
  127. num.push(n);
  128. }
  129. printf("%lf",num.top());cout<<endl;
  130. }
  131. return ;
  132. }

BUPT复试专题—解析表达式(2015)的更多相关文章

  1. BUPT复试专题—List(2015)

    题目描述 在该LIST上实现3种操作 1.append x在该LIST末尾添加x,x是32位整数 2.pop删除该LIST末尾的数 3.find i寻找第i个数,若i为负数表示寻找倒数第i个数,例如i ...

  2. BUPT复试专题—图像压缩存储(2015)

    题目描述 以二维数组表示图像,其值只有0.1两种,寻找两幅图像中最大的相同方阵   输入 第一行输入一个n,接下来的2n行输入两个n*n数组,寻找一个最大的m*m子区域,使得两个数组在该子区域完全相同 ...

  3. BUPT复试专题—求导数(2015)

    题目描述 描述:求函数f(x) = a*x^3 + b*x^2 + c*x + d在x = x0处的一阶导数.   输入 数据第一行是数据的组数m 接下来m行的每一行分别是 a b c d x0 输出 ...

  4. BUPT复试专题—字符串转换(2013计院)

    题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串.现在给你一个仅由小写字母组成的字符串, ...

  5. BUPT复试专题—统计时间间隔(2013计院)

    题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别代表小时和分钟.0≤x<24,0≤y<60. 输入格式 第一行为 ...

  6. BUPT复试专题—最值问题(2013计院)

    题目描述 给出N个数,求出这N个数中最大值和次大值.注意这里的次大值必须严格小于最大值.输入保证N个数中至少存在两个不同的数. 输入格式 第一行为测试数据的组数T(T≤20).请注意,任意两组测试数据 ...

  7. BUPT复试专题—数据库检索(2014软院)

    题目描述 在数据库的操作过程中,我们进场会遇到检索操作.这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果. 我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex) ...

  8. BUPT复试专题—最近公共祖先(2014软院)

    题目描述 给出一棵有N个节点的有根树TREE(根的编号为1),对于每组查询,请输出树上节点u和v的最近公共祖先. 最近公共祖先:对于有向树TREE的两个结点u,v.最近公共祖先LCA(TREE u,v ...

  9. BUPT复试专题—最长连续等差子数列(2014软院)

    题目描述   给定-个长度为N的整数数列,你需要在其中找到最长的连续子数列的长度, 并满足这个子数列是等差的.注意公差小于或等于0的情况也是允许的. 输入 第一行为数据组数T(1~100),表示测试数 ...

随机推荐

  1. kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

    第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...

  2. Google Breakpad: 实战crash .

    Google Breakpad: 实战crash . http://blog.csdn.net/zm_21/article/details/24795205 C/C++程序最棘手的时候就是一个字“挂” ...

  3. rest-framework-@action()装饰器

    路由Routers 使用方法:   在urls.py中定义路由 from rest_framework.routers import DefaultRouter # 定义视图集的路由 router = ...

  4. KDJ金叉测试

    # -*- coding: utf-8 -*- import os import pandas as pd # ========== 遍历数据文件夹中所有股票文件的文件名,得到股票代码列表stock_ ...

  5. 使用CreateRemoteThread把代码远程注入指定exe执行

    由于本人也是新手,如果有朋友不懂windows api相关知识,我相信查阅书籍或者百度会比我说有帮助的多,下面就我所做简单复述一下过程,欢迎指正缺点. 效果图示如下: 做的这个例子首先是创建了一个MF ...

  6. 【转】如何只用CSS做到完全居中

    英文原版链接:http://codepen.io/shshaw/full/gEiDt 我们都知道 margin:0 auto; 的样式能让元素水平居中,而 margin: auto; 却不能做到垂直居 ...

  7. 大数据DMP画像系统(转载 简介-龙果学院)

    一.目标 1.掌握画像标签开发技巧 2.掌握数据挖掘技巧 3.了解业内画像和DMP系统的架构和开发 4.大数据结合业务场景落地 系统开发要求 涉及的技术要点:spark .elasticsearch. ...

  8. 30、Django实战第30天:修改邮箱和用户信息

    修改个人邮箱需要完成两个接口,一个是获取验证码,一个是新的邮箱和验证码是否匹配 1.编辑users.views.py class SendEmailCodeView(LoginRequiredMixi ...

  9. NOIP2018有感

    近日小编不知博客写些什么,正巧语文假期留了作文,那就博客作文通用吧. 光阴似箭,日月如梭,一个学期不知不觉过去了,有很多事情令我难以忘记. 一周一共七天,其中有两天能休息,但是我只有一天能休息,因为这 ...

  10. C#外围工具资源

    1.MATH.NET数学库:可以用于 矩阵计算 方程求根 插值拟合 ... 2.