1655 文本计算器

1655: 文本计算器
Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 58  Solved: 16
[Submit][Status][Web Board]
Description
Bob讨厌复杂的数学运算.
看到练习册上的算术题,Bob很是头痛.
为了完成作业,Bob想要你帮忙写一个文本版的四则运算计算器.
这个计算器的功能需求十分简单,只要可以处理加减乘除和括号就可以了.
你能够帮助Bob吗?

 


Input
每个样例一行,输入一个长度小于1500的包含有'(',')','+','-','*','/',和'1'~'9'组成的四则运算表达式.
对于每个样例,参与运算数字在0~10000之间,表达式运算的结果在double的表示范围内.

 


Output
对于每一个例子,输出表达式的计算结果,精确到小数点后4位

 


Sample Input
3928*3180*3229+2137
2477*8638
1535+7452+3780+2061*280/3070/(7828-9348)

Sample Output
40333570297.0000
21396326.0000

12766.8763

思路:用栈先进后出的特点,存入后将可计算得先计算得到结果后再存入,进行下一项计算。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int MAX=1505;
char data[MAX];
double num[MAX]; //存数字
char sign[MAX];  //存符号
int ntop,stop;   //标记栈顶元素的位置
double sum;   //结果

void count() //基本的+-*/运算
{
    if(sign[stop]=='+')
    {
        num[ntop-1]+=num[ntop];
        ntop--;
    }
    else if(sign[stop]=='-')
    {
        num[ntop-1]-=num[ntop];
        ntop--;
    }
    else if(sign[stop]=='*')
    {
        num[ntop-1]*=num[ntop];
        ntop--;
    }
    else if(sign[stop]=='/')
    {
        num[ntop-1]/=num[ntop];
        ntop--;
    }
    stop--;
}

 int main()
 {
     int len;

     while(~scanf("%s",data))
     {
         ntop=0;
         stop=0;
         int markn=0,marks=0,marknode=0,ans=0,nodes;
         len=strlen(data);
         for(int i=0;i<=len;i++)
         {
             if(i!=len&&(data[i]>='0'&&data[i]<='9'||data[i]=='.'))
             {
                 if(data[i]=='.')//小数
                 {
                     marknode=1;//标记
                     nodes=0.1;
                 }
                 else
                 {
                     if(marknode)
                     {
                         ans=ans+(data[i]-'0')*nodes;
                         nodes=nodes*0.1;
                     }
                     else
                     ans=ans*10+data[i]-'0';
                     markn=1;
                 }

             }
             else
             {
                 if(markn)
                 {
                     num[++ntop]=ans;
                     markn=0;
                     marknode=0;
                     ans=0;
                 }
                 if(i==len)break;
                 if(data[i]=='-'||data[i]=='+')
                 {
                     while(stop&&sign[stop]!='(')
                           count();
                           sign[++stop]=data[i];
                 }
                 else if(data[i]=='*'||data[i]=='/')
                 {
                     while(stop&&(sign[stop]=='*'||sign[stop]=='/'))
                     count();
                     sign[++stop]=data[i];
                 }
                 else if(data[i]==')')
                 {
                     while(stop&&sign[stop]!='(')
                           count();
                           stop--;
                 }
                 else
                 sign[++stop]=data[i];

             }
         }
         while(stop)
         count();
         printf("%.4lf
",num[1]);
     }
 }
原文地址:https://www.cnblogs.com/dshn/p/4750718.html