3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
题目链接: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 |
+ + 2 * 3 - 7 4 / 8 4 |
13.0 |
| 2 |
/ -25 + * - 2 3 4 / 8 4 |
12.5 |
| 3 |
/ 5 + * - 2 3 4 / 8 2 |
ERROR |
| 4 |
+10.23 |
10.2 |
代码例如以下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
char s[47];
stack<double>ss; int is_op(char c)
{
if(c=='+' || c=='-' || c=='*' || c=='/')
return 1;
return 0;
}
int main()
{
while(gets(s))
{
while(!ss.empty())//清空
{
ss.pop();
}
int len = strlen(s);
int cc = 1;
double tsum = 0;
int flag = 0;//标记是否出现零作为除数的情况
for(int i = len-1; i >= 0; i--)
{
if(s[i]>='0' && s[i]<='9')
{
tsum+=(s[i]-'0')*cc;
cc*=10;
}
else if(s[i] == '.')//小数
{
tsum = tsum/(cc*1.0);
cc = 1;
}
else if((s[i]=='+'||s[i]=='-') && tsum!=0)
{
if(s[i] == '+')
{
ss.push(tsum);
i--;//跳过下一个空格
continue;
}
else
{
tsum = -tsum;
ss.push(tsum);
i--;//跳过下一个空格
continue;
} }
else if(s[i] == ' ')//当中一个运算数已经统计完
{
ss.push(tsum);
tsum = 0;
cc = 1;
continue;
}
else if(is_op(s[i]))//假设是运算符
{
double a = ss.top();
ss.pop();
double b = ss.top();
ss.pop();
double tt = 0;
if(s[i] == '+')
tt = a+b;
else if(s[i] == '-')
tt = a-b;
else if(s[i] == '*')
tt = a*b;
else if(s[i] == '/')
{
if(b == 0)
{
flag = 1;
break;
}
tt = a/b;
}
ss.push(tt);
i--;//跳过下一个空格
}
}
/*int k = 0;//记录最后栈内还剩有的数字有多少个,有多个则ERROR
int lenn = ss.size();
double tt;
for(int i = 0; i < lenn; i++)
{
tt = ss.top();
ss.pop();
if(!is_op(tt))
{
k++;
}
}
if(flag != 1)
printf("%.1lf\n",tt);*/
if(flag != 1)
printf("%.1lf\n",ss.top());
else
printf("ERROR\n");
}
return 0;
}
3-07. 求前缀表达式的值(25) (ZJU_PAT数学)的更多相关文章
- PTA笔记 堆栈模拟队列+求前缀表达式的值
基础实验 3-2.5 堆栈模拟队列 (25 分) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Sta ...
- pat02-线性结构3. 求前缀表达式的值(25)
02-线性结构3. 求前缀表达式的值(25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法.中缀表示法和后缀表示法 ...
- 【Zhejiang University PATest】02-3. 求前缀表达式的值
算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4.请设计程序计算 ...
- 信息竞赛进阶指南--递归法求中缀表达式的值,O(n^2)(模板)
// 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) { // 寻找未被任何括号包含的最后一个加减号 for (int i = r, j = 0; i >= ...
- openjduge 求简单表达式的值
表达式求值 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入 输入仅有一行 ...
- K:双栈法求算术表达式的值
相关介绍: 该算法用于求得一个字符串形式的表达式的结果.例如,计算1+1+(3-1)*3-(21-20)/2所得的表达式的值,该算法利用了两个栈来计算表达式的值,为此,称为双栈法,其实现简单且易于理 ...
- [LeetCode] Evaluate Division 求除法表达式的值
Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...
- [LeetCode] 399. Evaluate Division 求除法表达式的值
Equations are given in the format A / B = k, where A and B are variables represented as strings, and ...
- 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
private static int fun(int m) { ; ; i <= m; i++) { == ) temp = temp + i; else temp = temp - i; } ...
随机推荐
- mongodb debug
1,MongoDb log use local; db.startup_log.find();
- Python 单词字母顺序不变且所有倒排
翻出google測试project师的一道题目: 设计一个函数,不论什么语言都能够,实现下面功能: 一个句子,将句子中的单词所有倒排过来,但单词的字母顺序不变.eg. this is a real ...
- 【C语言】输入一组整数,求出这组数字子序列和中最大值
//输入一组整数.求出这组数字子序列和中最大值 #include <stdio.h> int MAxSum(int arr[],int len) { int maxsum = 0; int ...
- ACdreamOJ 1154 Lowbit Sum (数字dp)
ACdreamOJ 1154 Lowbit Sum (数位dp) ACM 题目地址:pid=1154" target="_blank" style="color ...
- 【计算几何初步-判断是否凸多边形】【HDU2108】Shape of HDU
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- 关于asp.net简单的下载问题
关于asp.net的下载,只需将打开相应的文件路径就能在浏览器上实现下载功能,比如项目的同级目录上有一个文件 苍老师.zip<a href="苍老师.zip">< ...
- UVA 10806 Dijkstra, Dijkstra.
题意: 从起点走到终点,然后从终点走到起点,其中不能同时走过相同的一条边,问你最小路径长度.先输入终点n,起点为1,接下来输入m,代表有m条边.每条边由起点,终点,长度组成. 分析: 求最小长度,还限 ...
- C# sliverlight调用WCF服务出现的一个错误
错误提示如下: 尝试向 URI“http://localhost:8396/Service1.svc”发出请求时出错.这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP ...
- mysql导出数据到excel表中
mysql> select b.username,a.subject,a.money,FROM_UNIXTIME(a.ctime) from shop_pay a INNER JOIN ...
- 不同css样式适应不同屏幕大小实现自适应宽度
@media screen and (判断属性){ CSS样式选择器 } 例如: <div class="silder_photo"></div> < ...