1019.简单计算器

Posted bernieloveslife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",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
",in.top());
    }
    return 0;
}

 


以上是关于1019.简单计算器的主要内容,如果未能解决你的问题,请参考以下文章

题目1019:简单计算器-------注意此题的输入中空格和字符和数字的关系,该用数据结构的时候就得用

在选择的底部导航视图项目上重新创建片段

golang代码片段(摘抄)

GLSL片段着色器-绘制简单的粗曲线

ruby 这个片段是一种简单的ruby方式,用于计算在Twitter上共享指定网址的次数。

PHP 精度计算引发的灾难性Bug