Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
代码:
//http://acm.hdu.edu.cn/showproblem.php?pid=1237
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
stack<int>num;
stack<char>fu;
double sum_num(double x,char a)//递归
{
if(fu.empty())//递归结束条件
{
switch(a)
{
case '*': return x*num.top();break;
case '/': return x/num.top();break;
case '+': return x+num.top();break;
case '-': return x-num.top();break;
}
}
switch(a)
{
case '+':
{
if(fu.top()=='*' || fu.top()=='/')//考虑下一个符号
{
double y=num.top();
num.pop();
char b=fu.top();
fu.pop();
return x+sum_num(y,b);
}
else
{
x+=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
}
break;
}
case '-':
{
if(fu.top()=='*' || fu.top()=='/')//考虑下一个符号
{
double y=num.top();
num.pop();
char b=fu.top();
fu.pop();
return x+sum_num(-y,b);//注意:千万不能写成x-sum_num(y,b)
}
else
{
x-=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
}
break;
}
case '*':
{
x*=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
break;
}
case '/':
{
x/=num.top();
num.pop();
a=fu.top();
fu.pop();
return sum_num(x,a);
break;
}
}
}
int main()
{
string f;
while(getline(cin,f))
{
if(f=="0")
break;
int len=f.size();
while(!num.empty()) //初始化以及清空栈
num.pop();
while(!fu.empty()) //初始化以及清空栈
fu.pop();
int x=0,p=1,j=0, i; //p用来判断一个数字是在这个数的个位十位还是其它,p就是相应10的几次方
for( i=len-1; i>=0; i--) //找到字串中的数
{
if(f[i]>='0' && f[i]<='9')
{
if(i<len-1 && (f[i+1]<'0'||f[i]>'9') )
{
num.push(x); //数入栈
x=0;
p=1;
}
if(i==0)
{
x=x+(f[i]-'0')*p;
num.push(x); //数入栈
}
x=x+p*(f[i]-'0');
p*=10;
}
else if(f[i]=='+' || f[i]=='-' || f[i]=='/' || f[i]=='*')
{
fu.push(f[i]); //符号入栈
}
}
double n=(double)num.top();
num.pop();
char a=fu.top();
fu.pop();
double sum=sum_num(n,a);
//cout<<sum<<endl;
printf("%.2lf\n",sum);
}
return 0;
}
分享到:
相关推荐
hdoj杭电1000-2000部分解题报告 部分是cpp 格式 部分是文档格式
算法入门训练题,搞算法的童鞋都需要看看的,基础类型
杭电OJ(1000-1099) AC 代码
这份压缩包内包含了2019年杭电多校第一场的数据与标程,欢迎下载
收集的部分HDOJ杭电ACM题的代码 大牛勿下 全是基础供初级acmer使用
杭电OJ题目源码记录 —— a source code of hdoj acm problem archive 简介 此项目为 的 题目以及代码仓库 src 中每一个文件夹代表一个题目 每个文件夹中都有 原题文档介绍.md 原题文档介绍.md 是工具自动生成 (无聊...
杭电ACM HDOJ2000~2099 JAVA解题源码,如果需要免积分下载请到(其中2062与2095无法解决超时问题,若有AC欢迎分享交流)
HDOJ题目分类HDOJ题目分类HDOJ题目分类
HDOJ使用说明书 HDOJ使用说明书 HDOJ使用说明书 HDOJ使用说明书
hdoj的一些题目分类,由hdu大牛搜集,希望对做ac的同志们有帮助
ACM ICPC HDOJ1002
ACM ICPC HDOJ1001
hdoj1001标程
hdoj上的资源,代码有注释,很不错的哦
杭电acm解题报告 详细解析2000-2099 适合acm初学者
hdoj1004,解题代码,答案代码,欢迎下载
一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧
ACM ICPC HDOJ1003
ACM ICPC HDOJ1008
杭州电子科技大学hdoj1002,大整数相加问题