九度OJ 题目1019:简单计算器

来源:互联网 发布:cad布局知乎 编辑:程序博客网 时间:2024/04/30 05:36
一题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

样例输入:

1 + 2
4 + 2 * 5 - 7 / 11
0
样例输出:

3.00
13.36

二.题目分析

     刚开始看到此题时还有点胆怯,脑子中一下子跳出逆波兰式,各种数字栈,操作符栈等,仔细看一下,只有+ - * /四种运算,没有括号,因此可以采用简答模拟的方式,遇见高优先级的* /就先运算,最后对只有+ -的运算进行二次运算。

三.代码

1.

#include <stdio.h>#include <stdlib.h>#define MAX 210int Isdigit(char ch){    if('0'<=ch&&ch<='9')        return 1;    return 0;}int main(){    char str[MAX],temp[MAX],opstack[MAX];    int i,j,k1,k2;    double numstack[MAX],x,t1,t2;       while(gets(str))    {        if(strlen(str)==1&&str[0]=='0')            break;        for(i=0,j=0;str[i]!='\0';i++)        {            if(str[i]!=' ')                temp[j++]=str[i];        }        temp[j]='\0';        k1=0;k2=0;        for(i=0;i<j;)        {            if(Isdigit(temp[i]))   //如果是数字,就如数字栈            {                x=temp[i++]-'0';                while(Isdigit(temp[i]))  //多位数字                {                    x*=10;                    x+=temp[i++]-'0';                }                 numstack[k1++]=x;  //入栈                 if(opstack[k2-1]=='*')   //当上一个操作符是*,/时,由于具有较高优先级,则先计算出结果                 {                     k1--;                     t1=numstack[k1];                     t2=numstack[k1-1];                     t1=t1*t2;                     numstack[k1-1]=t1;   //更新数字栈中口结果                     k2--;   //操作符 * /出栈                 }                 else if(opstack[k2-1]=='/')  //同上                 {                     k1--;                     t1=numstack[k1];                     t2=numstack[k1-1];                     t1=t2/t1;                     numstack[k1-1]=t1;                     k2--;                 }            }            else  //如果是操作符,则入操作符栈                opstack[k2++]=temp[i++];        }        //此时操作符栈中只有+ -,无优先顺序,按照从左到右顺序计算即可        x=numstack[0];        for(i=0;i<k2;i++)        {            if(opstack[i]=='+')                x+=numstack[i+1];            else                x-=numstack[i+1];        }        printf("%.2f\n",x);    }    return 0;}


2.某不知名网友

#include <stdio.h> int main(void){    double data[200];    int top;    double sum;    char operator, blank;    int dat;     while (scanf ("%d%c", &dat, &blank) != EOF){        if ((dat == 0) && (blank != ' '))            break;        data[0] = dat*1.0;        top = 0;        while (scanf ("%c %d%c", &operator, &dat, &blank) != EOF){            if (operator == '+') { ++top; data[top] = 1.0*dat; }            if (operator == '-') { ++top; data[top] = -1.0*dat; }            if (operator == '*') { data[top] *= dat; }            if (operator == '/') { data[top] /= dat; }            if (blank != ' ') break;        }        sum = 0.0;        while (top >= 0){            sum += data[top];            --top;        }        printf ("%.2lf\n", sum);    }    return 0;}


0 0
原创粉丝点击