码迷,mamicode.com
首页 > 其他好文 > 详细

1019.简单计算器

时间:2018-10-02 18:03:03      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:sim   pac   line   ==   计算表达   bool   简单   3.3   ane   

题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:
3.00
13.36

 Solution1:

#include<stdio.h> 
#define Max 200
int main(){
    double stack[Max];
    int top,i,n;
    double d,num,count; 
    char symbol,space;
    while(scanf("%d ",&n)!=EOF&&n){
        top=0;
        stack[++top]=1.0*n;
        while(scanf("%c%lf%c",&symbol,&num,&space)!=EOF){
            if(symbol ==+){
                stack[++top]=num;
            }else if(symbol==-){
                stack[++top]=-1*num;
            }else if(symbol==*){
                stack[top]=stack[top]*num;
            }else if(symbol==/){
                stack[top]=stack[top]/num;
            }
            if(space!= ){
                    break;
            }
        } 
        count=0;
        for(i=1;i<=top;i++)
            count+=stack[i];
        printf("%.2lf\n",count);
          
    }
    return 0;
}

 

 

Solution2:

 

#include<stack>
#include<stdio.h>
using namespace std;

char str[220];
int mat[][5]={
        1,0,0,0,0,
        1,0,0,0,0,
        1,0,0,0,0,
        1,1,1,0,0,
        1,1,1,0,0
};
stack<int> op;
stack<double> in;
void getop(bool &reto,int &retn,int &i){
    if(i==0 && op.empty()==true){
        reto=true;
        retn=0;
        return;
    }
    if(str[i]==0){
        reto=true;
        retn=0;
        return;
    }
    if(str[i]>=0 && str[i]<=9){
        reto=false;
    }
    else{
        reto=true;
        if(str[i]==+){
            retn=1;
        }
        else if(str[i]==-){
            retn=2;
        }
        else if(str[i]==*){
            retn=3;
        }
        else if(str[i]==/){
            retn=4;
        }
        i+=2;
        return;
    }
    retn=0;
    for(;str[i]!=  && str[i]!=0;i++){
        retn*=10;
        retn+=str[i]-0;
    }
    if(str[i]== ) i++;
    return;
}

int main(){
    while(gets(str)){
        if(str[0]==0 && str[1]==0) break;
        bool retop;
        int retnum;
        int idx=0;
        while(!op.empty()) op.pop();
        while(!in.empty()) in.pop();
        while(true){
            getop(retop,retnum,idx);
            if(retop==false){
                in.push((double)retnum);
            }
            else{
                double temp;
                if(op.empty()==true || mat[retnum][op.top()]==1){
                    op.push(retnum);
                }
                else{
                    while(mat[retnum][op.top()]==0){
                        int ret=op.top();
                        op.pop();
                        double b=in.top();
                        in.pop();
                        double a=in.top();
                        in.pop();
                        if(ret==1) temp=a+b;
                        else if(ret==2) temp=a-b;
                        else if(ret==3) temp=a*b;
                        else temp=a/b;
                        in.push(temp);
                    }
                    op.push(retnum);
                }
            }
            if(op.size()==2 && op.top()==0) break;
        }
        printf("%.2f\n",in.top());
    }
    return 0;
}

 

1019.简单计算器

标签:sim   pac   line   ==   计算表达   bool   简单   3.3   ane   

原文地址:https://www.cnblogs.com/bernieloveslife/p/9736637.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!