zoukankan      html  css  js  c++  java
  • 简单计算器(stack)

    题目描述

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

    输入

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

    输出

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

    样例输入

    30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
    0

    样例输出

    12178.21

    用栈的思想,将中缀表达式转换成后缀表达式

    转换规则:

    1、如果是空格,i++,跳过;

    2、如果是数字,记录这个完整的数字,放入data栈内;

    3、如果是运算符号,判断优先级别是否高于sig栈顶元素,若是,把当前的符号进栈

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int Rank(char f)
    {
        int aa;
        if(f=='*'||f=='/')
            aa=2;
        if(f=='+'||f=='-')
            aa=1;
        return aa;
    }
    int main()
    {
        stack<char> sig;
        stack<double> data;
        string str;
        ll i,t;
        while(1)
        {
            getline(cin,str);
            if(str=="0")
            {
                break;
            }
            i=t=0;
            while(str[i]||!sig.empty())
            {
                if(str[i]==' ')
                {
                    i++;
                }
                else if(str[i]>='0'&&str[i]<='9')
                {
                    t=t*10+str[i]-'0';
                    i++;
                    if(str[i]<'0'||str[i]>'9')
                    {
                        data.push(t);
                        t=0;
                    }
                }
                else if(sig.empty()||Rank(str[i])>Rank(sig.top()))
                {
                    sig.push(str[i]);
                    i++;
                }
                else
                {
                    double fir,sec;
                    switch(sig.top())
                    {
                    case '+':
                        {
                            fir=data.top();
                            data.pop();
                            sec=data.top();
                            data.pop();
                            data.push(fir+sec);
                        }
                        break;
                    case '-':
                        {
                            fir=data.top();
                            data.pop();
                            sec=data.top();
                            data.pop();
                            data.push(sec-fir);
                        }
                        break;
                    case '*':
                        {
                            fir=data.top();
                            data.pop();
                            sec=data.top();
                            data.pop();
                            data.push(fir*sec);
                        }
                        break;
                    case '/':
                        {
                            fir=data.top();
                            data.pop();
                            sec=data.top();
                            data.pop();
                            data.push(sec/fir);
                        }
                        break;
                    }
                    sig.pop();
                }
            }
            printf("%.2f
    ",data.top());
        }
        return 0;
    }
  • 相关阅读:
    Making a CocoaPod
    关于Http
    The podfile
    iOS 8个实用小技巧(总有你不知道的和你会用到的)
    关于深拷贝浅拷贝
    适配ios10(iTunes找不到构建版本)
    iOS 10 推送的简单使用
    __block 和 __weak的区别
    Masonry使用注意事项
    iOS数字键盘自定义按键
  • 原文地址:https://www.cnblogs.com/jackwang-sparrow/p/13861147.html
Copyright © 2011-2022 走看看