您的位置:首页 > 其它

简单计算器(递归写法)

2015-07-20 11:41 357 查看
暑假集训练手一发: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83171#overview
Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 

 

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 

 

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 

 

Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

思想很简单:递归处理,先做乘除!(写的很挫)

// http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83171#overview #include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
vector <double> IQ;
vector <char> CQ;
double solve(int p){
//if(p==IQ.size()-1)return IQ[p];
//if(CQ[p]=='+')return IQ[p]+solve(p+1);
//if(CQ[p]=='-')return IQ[p]-solve(p+1);
double x = IQ[p];
while((p<IQ.size()-1)&&(CQ[p]=='*'||CQ[p]=='/')){
if(CQ[p]=='*')x=x*IQ[p+1];
if(CQ[p]=='/')x=x/IQ[p+1];
p++;
}
if(p==IQ.size()-1)return x;
if(CQ[p]=='+')return x+solve(p+1);
if(CQ[p]=='-'){
int q = p+1;
while(q<CQ.size()){
if(CQ[q]=='+')CQ[q]='-';
else if(CQ[q]=='-')CQ[q]='+';
q++;
}
return x-solve(p+1);
}
}
int main(){
char str[222];
while(gets(str),strcmp(str,"0")!=0){
// puts(str);
int len = strlen(str);
IQ.clear();
CQ.clear();
for(int i=0;i<len;i++){
int x=0;
bool flag = false;
while(i<len&&isdigit(str[i])){
x=x*10+str[i]-'0';
i++;
flag = true;
}
if(flag)
IQ.push_back(x*1.0);
else
CQ.push_back(str[i++]);
}
// cout<<IQ.size()<<endl;
// for(int i=0;i<IQ.size();i++)cout<<IQ[i]<<" ";cout<<endl;
// cout<<CQ.size()<<endl;
// for(int i=0;i<CQ.size();i++)cout<<CQ[i]<<"";cout<<endl;
double ans = solve(0);
printf("%.2lf\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算器 递归 容器