NYOJ128 前缀式计算(栈的运用)
题目信息:
http://acm.nyist.net/JudgeOnline/problem.php?
pid=128
+ 2 * + 3 4 5的值就是 37,详见输入输出。
- 输入
- 有多组測试数据,每组測试数据占一行,随意两个操作符之间。随意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数。而且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。 - 输出
- 对每组数据,输出该前缀表达式的值。
输出结果保留两位小数。
- 例子输入
-
+ 2 * + 3 4 5
+ 5.1 / 3 7 - 例子输出
-
37.00
5.53
题目分析:
用两个栈进行存下数字和操作,进行计算,我刚開始想的是,每当连续输入两个数即可进行计算,并将结果压入数字栈中,而且操作时。应该保证后出栈的数字在前。先出栈的在后,这样能够保证-、/的结果。
。。。。哎。不知道为什么一直Wa,最后看看别人打代码。这题能够从后往前计算。遇到操作符进行计算即可。此题须要注意就是字符串到数字的转换。
AC代码:
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
char str[1005];
stack<double> dt;
int start; void vol(){
int i=0,k=0;
char a[15],b[15];
for(;str[start]!=' ';start--){
a[k++]=str[start];
}
start--;//去掉数字后面的空格
a[k]='\0';
//strrev();此函数不能用
for(i=0;i<k/2;i++){
char c=a[i];
a[i]=a[k-1-i];;
a[k-1-i]=c;
}
dt.push(atof(a));
}
double YunSuan(){
double a,b;
while(start!=-2){
switch (str[start]){
case '+':
a=dt.top(); dt.pop();
b=dt.top(); dt.pop();
dt.push(b+a);start-=2;//去掉该字符和字符后面的空格
break;
case '-':
a=dt.top(); dt.pop();
b=dt.top(); dt.pop();
dt.push(a-b);start-=2;
break;
case '*':
a=dt.top(); dt.pop();
b=dt.top(); dt.pop();
dt.push(a*b);start-=2;
break;
case '/':
a=dt.top(); dt.pop();
b=dt.top(); dt.pop();
dt.push(a/b);start-=2;
break;
default: vol();
}
}
return dt.top();
}
int main()
{
while(gets(str)){
start=strlen(str)-1;
printf("%.2lf\n",YunSuan());
}
return 0;
}
我的代码:
int main()
{
string str;
int i,k;
double a,b;
while(getline(cin,str)){
stack<double> dt;
stack<char> ct;
i=-1; k=0;
while(i!=str.size()){
++i;
if(str[i] == ' ') ++i;
if(str[i] >= '0' && str[i] <= '9'){
string res; double temp;
while(i != str.size() && str[i] != ' ')
res += str[i++];
sscanf(res.c_str(), "%lf", &temp);
//cout<<temp<<endl;
dt.push(temp),++k;
//++k;
}
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){
ct.push(str[i++]);
k=0;
}
if(k==2&&dt.size()>1){
a=dt.top();
dt.pop();
b=dt.top();
dt.pop();
char c=ct.top();
ct.pop();
if(c=='+') dt.push(b+a);
if(c=='-') dt.push(b-a);
if(c=='*') dt.push(b*a);
if(c=='/') dt.push(b/a);
k=1;
}
}
while(dt.size()>1&&ct.size()){//计算最后一个
a=dt.top();
dt.pop();
b=dt.top();
dt.pop();
char c=ct.top();
ct.pop();
if(c=='+') dt.push(b+a);
if(c=='-') dt.push(b-a);
if(c=='*') dt.push(b*a);
if(c=='/') dt.push(b/a);
}
int k=1;
if(ct.size()&&ct.top()=='-') k=-1;
printf("%.2lf\n",k*dt.top());
}
return 0;
}
NYOJ128 前缀式计算(栈的运用)的更多相关文章
- NYOJ128 前缀式计算 【栈】
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...
- NYOJ128前缀式计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...
- NYOJ 128 前缀式计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...
- 前缀式计算 nyoj
题目描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 ...
- nyoj-----前缀式计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀 ...
- NYOJ--128--前缀式计算(表达式求值)
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...
- 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装
一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...
- 搜索广告与广告网络Demand技术-流式计算平台
流式计算平台-Storm 我们以Storm为例来看流式计算的功能是什么. 下面内容引用自大圆的博客.在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapRed ...
- 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15
上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...
随机推荐
- C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)
第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT extern "c" _declspec(dllexport) #dlse # ...
- 去掉ILDasm的SuppressIldasmAttribute限制
原文:去掉ILDasm的SuppressIldasmAttribute限制 今天本打算汉化一个.Net程序的,当用ILDasm打开的时候,出现了"受保护模块—无法进行反汇编"的错误 ...
- HTML5 服务器发送事件(Server-Sent Events)介绍
w3cschool菜鸟教程 Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新 ...
- MSSQL 获取指定日期所在星期的第一天和最后一天日期 获取指定日期坐在月的第一天和最后一天
ufn_GetWeekFirstAndEndDay 获取指定日期所在星期的第一天和最后一天日期 ALTER FUNCTION [dbo].[ufn_GetWeekFirstAndEndDay]( ...
- U-boot中实现Yaffs2+HwEcc
经过老手的指点,要实现Yaffs2+HwEcc,重点在于chip->ops.mode由MTD_OOB_RAW到MTD_OOB_AUTO.经过几天的筹备,今天要对其下手了.为了真实展现分析移植过程 ...
- GNU/Linux Distribution Timeline v12.10
GNU/Linux Distribution Timeline v12.10 原图下载 GNULinux Distribution Timeline 12.10.png GNU/Linux Distr ...
- 公司需求知识自学- Hashtable简单应用
定义表 Hashtable tblNames = new Hashtable(); 添加key,value键值对 tblNames.Add("A","a"); ...
- Python学习笔记4-如何快速的学会一个Python的模块、方法、关键字
想要快速的学会一个Python的模块和方法,两个函数必须要知道,那就是dir()和help() dir():能够快速的以集合的型式列出该模块下的所有内容(类.常量.方法)例: #--encoding: ...
- const和define的区别
1.在使用const定义常量时,只能使用标量初始化; 但我们可以使用任何表达式初始化define定义的常量 2.我们可以在条件表达式中使用define定义常量,但绝对不能使用const eg: def ...
- Codeforces 475C Kamal-ol-molk's Painting 模拟
主题链接:点击打开链接 意甲冠军:特定n*m矩阵 X代表色 .代表无色 随着x*y形刷子去涂色. 刷子每次能够→或↓移动随意步. 若可以染出给定的矩阵,则输出最小的刷子的面积 若不能输出-1 思路: ...