简单计算器(递归写法)

暑假集训练手一发: 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;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值