题目信息:

http://acm.nyist.net/JudgeOnline/problem.php?

pid=128

+ 2 * + 3 4 5的值就是 37,详见输入输出。

输入
有多组測试数据,每组測试数据占一行,随意两个操作符之间。随意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数。而且都小于10,操作数数目不超过500。

以EOF为输入结束的标志。
输出
对每组数据,输出该前缀表达式的值。

输出结果保留两位小数。

例子输入
  1. + 2 * + 3 4 5
  2. + 5.1 / 3 7
例子输出
  1. 37.00
  2. 5.53

题目分析:

用两个栈进行存下数字和操作,进行计算,我刚開始想的是,每当连续输入两个数即可进行计算,并将结果压入数字栈中,而且操作时。应该保证后出栈的数字在前。先出栈的在后,这样能够保证-、/的结果。

。。。。哎。不知道为什么一直Wa,最后看看别人打代码。这题能够从后往前计算。遇到操作符进行计算即可。此题须要注意就是字符串到数字的转换。

AC代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<map>
  4. #include<cstring>
  5. #include<string>
  6. #include<algorithm>
  7. #include<queue>
  8. #include<vector>
  9. #include<stack>
  10. #include<cstdlib>
  11. #include<cctype>
  12. #include<cstring>
  13. #include<cmath>
  14. using namespace std;
  15. char str[1005];
  16. stack<double> dt;
  17. int start;
  18.  
  19. void vol(){
  20. int i=0,k=0;
  21. char a[15],b[15];
  22. for(;str[start]!=' ';start--){
  23. a[k++]=str[start];
  24. }
  25. start--;//去掉数字后面的空格
  26. a[k]='\0';
  27. //strrev();此函数不能用
  28. for(i=0;i<k/2;i++){
  29. char c=a[i];
  30. a[i]=a[k-1-i];;
  31. a[k-1-i]=c;
  32. }
  33. dt.push(atof(a));
  34. }
  35. double YunSuan(){
  36. double a,b;
  37. while(start!=-2){
  38. switch (str[start]){
  39. case '+':
  40. a=dt.top(); dt.pop();
  41. b=dt.top(); dt.pop();
  42. dt.push(b+a);start-=2;//去掉该字符和字符后面的空格
  43. break;
  44. case '-':
  45. a=dt.top(); dt.pop();
  46. b=dt.top(); dt.pop();
  47. dt.push(a-b);start-=2;
  48. break;
  49. case '*':
  50. a=dt.top(); dt.pop();
  51. b=dt.top(); dt.pop();
  52. dt.push(a*b);start-=2;
  53. break;
  54. case '/':
  55. a=dt.top(); dt.pop();
  56. b=dt.top(); dt.pop();
  57. dt.push(a/b);start-=2;
  58. break;
  59. default: vol();
  60. }
  61. }
  62. return dt.top();
  63. }
  64. int main()
  65. {
  66. while(gets(str)){
  67. start=strlen(str)-1;
  68. printf("%.2lf\n",YunSuan());
  69. }
  70. return 0;
  71. }

我的代码:

  1. int main()
  2. {
  3. string str;
  4. int i,k;
  5. double a,b;
  6. while(getline(cin,str)){
  7. stack<double> dt;
  8. stack<char> ct;
  9. i=-1; k=0;
  10. while(i!=str.size()){
  11. ++i;
  12. if(str[i] == ' ') ++i;
  13. if(str[i] >= '0' && str[i] <= '9'){
  14. string res; double temp;
  15. while(i != str.size() && str[i] != ' ')
  16. res += str[i++];
  17. sscanf(res.c_str(), "%lf", &temp);
  18. //cout<<temp<<endl;
  19. dt.push(temp),++k;
  20. //++k;
  21. }
  22. if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){
  23. ct.push(str[i++]);
  24. k=0;
  25. }
  26. if(k==2&&dt.size()>1){
  27. a=dt.top();
  28. dt.pop();
  29. b=dt.top();
  30. dt.pop();
  31. char c=ct.top();
  32. ct.pop();
  33. if(c=='+') dt.push(b+a);
  34. if(c=='-') dt.push(b-a);
  35. if(c=='*') dt.push(b*a);
  36. if(c=='/') dt.push(b/a);
  37. k=1;
  38. }
  39. }
  40. while(dt.size()>1&&ct.size()){//计算最后一个
  41. a=dt.top();
  42. dt.pop();
  43. b=dt.top();
  44. dt.pop();
  45. char c=ct.top();
  46. ct.pop();
  47. if(c=='+') dt.push(b+a);
  48. if(c=='-') dt.push(b-a);
  49. if(c=='*') dt.push(b*a);
  50. if(c=='/') dt.push(b/a);
  51. }
  52. int k=1;
  53. if(ct.size()&&ct.top()=='-') k=-1;
  54. printf("%.2lf\n",k*dt.top());
  55. }
  56. return 0;
  57. }


NYOJ128 前缀式计算(栈的运用)的更多相关文章

  1. NYOJ128 前缀式计算 【栈】

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...

  2. NYOJ128前缀式计算

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...

  3. NYOJ 128 前缀式计算

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...

  4. 前缀式计算 nyoj

    题目描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 ...

  5. nyoj-----前缀式计算

    前缀式计算 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀 ...

  6. NYOJ--128--前缀式计算(表达式求值)

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...

  7. 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装

    一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...

  8. 搜索广告与广告网络Demand技术-流式计算平台

    流式计算平台-Storm 我们以Storm为例来看流式计算的功能是什么. 下面内容引用自大圆的博客.在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapRed ...

  9. 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15

    上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...

随机推荐

  1. Oracle EBS-SQL (MRP-2):检查期间主计划录入记录数.sql

    SELECT      FU.description                           创建者,      MSD.CREATION_DATE             创建日期,   ...

  2. Today See>

    http://wenku.baidu.com/view/b08f3575f46527d3240ce061.html http://wenku.baidu.com/view/a3419558be2348 ...

  3. Delphi 实现任务栏多窗口图标显示

    uses Windows; type TfrmLogin = class(TForm) end; implementation {$R *.dfm} procedure TfrmLogin.FormC ...

  4. 如何去除List中的重复值?

    今天碰到一个问题,已经有一个List<string>,里面有重复值,希望将重复值去掉,同时不能破坏现有的顺序. 感谢 http://bbs.csdn.net/topics/39024721 ...

  5. Codeforces 325E

    Codeforces 325E 原题 题目描述:给出\(n\)个点, 编号为\(0 \text ~ n-1\),每个点连出两条边分别为\(2i\)和\(2i+1\)(\(mod n\)),现从\(0\ ...

  6. omnibus方式部署gitlab

    omnibus方式部署gitlab Posted on 2015 年 1 月 10 日   4233 Views 这几天折腾搭建git服务器,选择了比较流行的gitlab,一开始就直奔一键安装脚本去了 ...

  7. 在magento中发邮件

    1. 在system->Configuration->Store Email Addresses中设置General Contact的Sender Name.Sender Email. S ...

  8. uva 10306 - e-Coins(完全背包)

    题目链接:10306 - e-Coins 题目大意:给出m和s, 再给出m种电子硬币,每种硬币有两种金额xi,yi.现在要在m种硬币种选若干个硬币,可以重复选同一种硬币, 使得(x1 + x2 + . ...

  9. asp.net textbox控件基础

    asp.net有两种控件,一种是html控件,一种是asp控件,在说textbox控件之前,先看看按钮的两个命令oncommand和onclick.每次点击按钮后,都会提交命令,但是程序会首先执行Pa ...

  10. VMware vSphere Client为虚拟机制定物理网卡(图文并茂)

    1.首先,查看我的服务器有几张网卡,如下图共3张,接下来我将为虚拟主机制定一张网卡,以及为当中的两台虚拟的CentOS7各制定一张网卡. 2.打开“硬件”---->“网络”,如图,已经启用一张网 ...