1019.简单计算器

题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过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;
}

 

posted @ 2018-10-02 11:18  bernieloveslife  阅读(300)  评论(0编辑  收藏  举报