题目链接:http://pat.zju.edu.cn/contests/ds/3-07

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式说明:

输入在一行内给出不超过30个字符的前缀表达式,仅仅包括+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式说明:

输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

例子输入与输出:

序号 输入 输出
1
  1. + + 2 * 3 - 7 4 / 8 4
  1. 13.0
2
  1. / -25 + * - 2 3 4 / 8 4
  1. 12.5
3
  1. / 5 + * - 2 3 4 / 8 2
  1. ERROR
4
  1. +10.23
  1. 10.2

代码例如以下:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <stack>
  6. using namespace std;
  7. char s[47];
  8. stack<double>ss;
  9.  
  10. int is_op(char c)
  11. {
  12. if(c=='+' || c=='-' || c=='*' || c=='/')
  13. return 1;
  14. return 0;
  15. }
  16. int main()
  17. {
  18. while(gets(s))
  19. {
  20. while(!ss.empty())//清空
  21. {
  22. ss.pop();
  23. }
  24. int len = strlen(s);
  25. int cc = 1;
  26. double tsum = 0;
  27. int flag = 0;//标记是否出现零作为除数的情况
  28. for(int i = len-1; i >= 0; i--)
  29. {
  30. if(s[i]>='0' && s[i]<='9')
  31. {
  32. tsum+=(s[i]-'0')*cc;
  33. cc*=10;
  34. }
  35. else if(s[i] == '.')//小数
  36. {
  37. tsum = tsum/(cc*1.0);
  38. cc = 1;
  39. }
  40. else if((s[i]=='+'||s[i]=='-') && tsum!=0)
  41. {
  42. if(s[i] == '+')
  43. {
  44. ss.push(tsum);
  45. i--;//跳过下一个空格
  46. continue;
  47. }
  48. else
  49. {
  50. tsum = -tsum;
  51. ss.push(tsum);
  52. i--;//跳过下一个空格
  53. continue;
  54. }
  55.  
  56. }
  57. else if(s[i] == ' ')//当中一个运算数已经统计完
  58. {
  59. ss.push(tsum);
  60. tsum = 0;
  61. cc = 1;
  62. continue;
  63. }
  64. else if(is_op(s[i]))//假设是运算符
  65. {
  66. double a = ss.top();
  67. ss.pop();
  68. double b = ss.top();
  69. ss.pop();
  70. double tt = 0;
  71. if(s[i] == '+')
  72. tt = a+b;
  73. else if(s[i] == '-')
  74. tt = a-b;
  75. else if(s[i] == '*')
  76. tt = a*b;
  77. else if(s[i] == '/')
  78. {
  79. if(b == 0)
  80. {
  81. flag = 1;
  82. break;
  83. }
  84. tt = a/b;
  85. }
  86. ss.push(tt);
  87. i--;//跳过下一个空格
  88. }
  89. }
  90. /*int k = 0;//记录最后栈内还剩有的数字有多少个,有多个则ERROR
  91. int lenn = ss.size();
  92. double tt;
  93. for(int i = 0; i < lenn; i++)
  94. {
  95. tt = ss.top();
  96. ss.pop();
  97. if(!is_op(tt))
  98. {
  99. k++;
  100. }
  101. }
  102. if(flag != 1)
  103. printf("%.1lf\n",tt);*/
  104. if(flag != 1)
  105. printf("%.1lf\n",ss.top());
  106. else
  107. printf("ERROR\n");
  108. }
  109. return 0;
  110. }

3-07. 求前缀表达式的值(25) (ZJU_PAT数学)的更多相关文章

  1. PTA笔记 堆栈模拟队列+求前缀表达式的值

    基础实验 3-2.5 堆栈模拟队列 (25 分) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Sta ...

  2. pat02-线性结构3. 求前缀表达式的值(25)

    02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法 ...

  3. 【Zhejiang University PATest】02-3. 求前缀表达式的值

    算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算 ...

  4. 信息竞赛进阶指南--递归法求中缀表达式的值,O(n^2)(模板)

    // 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) { // 寻找未被任何括号包含的最后一个加减号 for (int i = r, j = 0; i >= ...

  5. openjduge 求简单表达式的值

    表达式求值 总时间限制:  10000ms  单个测试点时间限制:  1000ms  内存限制:  131072kB 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入 输入仅有一行 ...

  6. K:双栈法求算术表达式的值

    相关介绍:  该算法用于求得一个字符串形式的表达式的结果.例如,计算1+1+(3-1)*3-(21-20)/2所得的表达式的值,该算法利用了两个栈来计算表达式的值,为此,称为双栈法,其实现简单且易于理 ...

  7. [LeetCode] Evaluate Division 求除法表达式的值

    Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...

  8. [LeetCode] 399. Evaluate Division 求除法表达式的值

    Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...

  9. 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m

    private static int fun(int m) { ; ; i <= m; i++) { == ) temp = temp + i; else temp = temp - i; } ...

随机推荐

  1. Linux进程笔记

    进程及作业管理 Uninterruptible sleep: 不可中断的睡眠Interruptible sleep:可中断睡眠 kernel:init: COW: Copy On Write, 写时复 ...

  2. Cable master(好题,二分)

    Cable master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  3. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  4. 系统开发中按下Enter键登录系统

    转载来自:http://www.jb51.net/article/54308.htm 系统开发中按下Enter键登录系统,即就是监听键盘,当按下Enter键后调用登录按钮的click()事件. JS方 ...

  5. Jq合成事件绑定

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. c# 数据库缓存依赖

    1.为缓存依赖项启动通知数据库 在vs开发人员命令提示中运行(切换到aspnet_regsql.exe所在目录,示例目录:C:\Windows\Microsoft.NET\Framework64\v4 ...

  7. sql 事务和回滚

    (1) set ANSI_NULLS ON --见图1 set QUOTED_IDENTIFIER ON go ALTER proc [dbo].[procname] as begin begin t ...

  8. [Effective Modern C++] Item 3. Understand decltype - 了解decltype

    条款三 了解decltype 基础知识 提供一个变量或者表达式,decltype会返回其类型,但是返回的内容会使人感到奇怪. 以下是一些简单的推断类型: ; // decltype(i) -> ...

  9. arm str 指令

    str 指令格式: str{条件} 1源寄存器 ,2存储器地址 eg: str r0,[r1],#8;将r0中的数值赋值给r1,然后在r1地址上+立即数8,再写入r1中: str r0,[r1,#8] ...

  10. 原生化:AnDevCon 2014 McVeigh 的主题演讲

    作者:Jeff McVeigh(Intel) 基于(至少部分)NDK的原生安卓应用程序占现在前1000 强的 60% 以上.该增长的原因很简单:开发商需要为用户提供超卓的体验(包括灵敏的反应.与丰富的 ...