• 简易计算器


    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;
    }

    有所鉴借;

  • 相关阅读:
    第五章 Python——字符编码与文件处理
    第六章 Python——函数与面向过程编程
    第七章 Python——模块与包
    第一章 计算机硬件基础与操作系统介绍
    luogu P1706 全排列问题
    luogu 2142 高精度减法
    luogu P1601 高精度加法
    luogu P1803 线段覆盖 贪心
    luogu P1031 均分纸牌 贪心
    luogu P2678 跳石头 二分答案
  • 原文地址:https://www.cnblogs.com/7750-13/p/7206676.html
Copyright © 2020-2023  润新知