简易计算器

1.读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 

2.Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 

3.Output对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 

这道题的难处在于如何判断运算的先后顺序,仔细思考下我们就知道可以利用Stack来存储我们需要的数字,而运算符仅作判断使用。

我们又知道——我们输入的时候先 数字 再 运算符;故可用两个while()进行输入;(因为一开始的输入规则和后面的规则有所区别)

讲一下这道提题的难点。

1.输入格式的把握;

  两个while(),先输入数字 cin >> n; 在输入运算符 c=getchar();

  利用string s; 这就需要多个if()来判断哪些应该是整数并将其转化为数值;(较为复杂,但在第二种方法中使用);

2.运算符的先后;

  建一个stack<double> array; 先压数字 ,根据前一个的运算符判断——如果是“ ”或 “ / ”则把即将压栈的数值和栈的顶值相乘,再压栈;

  两个栈,一个数值栈,一个运算符栈,写一个函数Compare()比较运算符大小——然后可以直接写运算的方法,不再考虑运算先后;再一个压栈的方法(边压栈,边计算结果);

#include <iostream>
#include <map>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
stack<double> num;

int main()
{
    int n;
    while(cin >> n)
    {
        char c;
        c = getchar();
        if(c=='
'&&n==0)
            break;
        num.push(n);
        c = getchar();
        double m;
        while(cin >> n)
        {
            if(c=='*')
            {
                m = num.top();
                m *=n;
                num.pop();
                num.push(m);
            }
            if(c=='/')
            {
                m = num.top();
                m/=n;
                num.pop();
                num.push(m);
            }
            if(c=='+')
            {
                num.push(n);
            }
            if(c=='-')
            {
                num.push(-n);
            }
            if(getchar()=='
')
                break;
            c = getchar();
        }

        double sum = 0;
        while(!num.empty())
        {
            sum+=num.top();
            num.pop();
        }

        printf("%0.2lf
",sum);
    }
    return 0;
}

有所鉴借;

原文地址:https://www.cnblogs.com/7750-13/p/7206676.html