zoukankan      html  css  js  c++  java
  • 1356:计算(calc)

    题目描述】

    小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)

    【输入】

    共1行,为一个算式。

    【输出】

    共1行,就是密码。

    【输入样例】

    1+(3+2)*(7^2+6*9)/(2)

    【输出样例】

    258

    #include <cmath>
    #include <iostream>
    using namespace std;
    
    const int N = 255;
    int n[N] = {0};
    char c[N] = {0};
    
    bool first(char ch1, char ch2)
    {//判断ch1是否比ch2优先级高
        if (ch1 == '^') {//优先级最高
            return true;
        }
        if (ch2 == '^') {//优先级最高
            return false;
        }
        if (ch2 == ')') {//优先级最低
            return true;
        }
        if (ch1 == '-' || ch1 == '+') {//优先级较低
            if (ch2 == '-' || ch2 == '+') {
                return true;
            }
            return false;
        }
        if (ch1 == '*' || ch1 == '/') {//优先级较高
            return true;
        }
        return false;
    }
    
    int calc(int a, int b, char op)
    {
        switch (op) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
            case '^':
                return pow(a, b);
        }
        return 0;
    }
    
    void show(int ntop, int ctop)
    {
        for (int i = 0; i < ntop; i++) {
            cout << n[i] << " ";
        }
        cout << "; ";
        for (int i = 0; i < ctop; i++) {
            cout << c[i] << " ";
        }
        cout << endl;
    }
    
    int main()
    {
        char ch = 0;
        int a = 0, b;
        int ntop = 0, ctop = 0;
        while (ch != '@') {//结束
            //cout<<"ntop:"<<ntop<<endl;
            ch = cin.get();
            switch (ch) {
                case '+':
                case '-':
                case '*':
                case '/':
                case '^':
                    n[ntop++] = a;
                    while (ctop > 0 && first(c[ctop - 1], ch)) {
                        b = n[--ntop];
                        a = n[--ntop];
                        n[ntop++] = calc(a, b, c[--ctop]);
                    }
                    c[ctop++] = ch;
                    //show(ntop,ctop);
                    a = 0;
                    break;
                case '(':
                    c[ctop++] = ch;
                    break;
                case ')':
                    n[ntop++] = a;
                    //show(ntop,ctop);
                    while (ctop > 0 && c[ctop - 1] != '(' && first(c[ctop - 1], ch)) {
                        b = n[--ntop];
                        a = n[--ntop];
                        n[ntop++] = calc(a, b, c[--ctop]);
                    }
                    //show(ntop,ctop);
                    if (c[ctop - 1] == '(') {//弹出(
                        a = n[--ntop];
                        ctop--;
                    }
                    //show(ntop,ctop);
                    break;
                default:
                    if (ch >= '0' && ch <= '9') {
                        a = a * 10 + (ch - '0');
                    } else {//结束
                        n[ntop++] = a;
                        while (ctop > 0) {
                            //show(ntop,ctop);
                            b = n[--ntop];
                            a = n[--ntop];
                            n[ntop++] = calc(a, b, c[--ctop]);
                        }
                        ch = '@';
                    }
                    break;
            }
        }
        cout << n[--ntop];
        return 0;
    }
    

      

  • 相关阅读:
    Android官方架构组件介绍之ViewModel
    Android官方架构组件介绍之LiveData
    Android官方架构组件介绍之LifeCycle
    Android N 通知概览及example
    Project和Task
    hello gradle
    写出gradle风格的groovy代码
    Groovy中的面向对象
    tcp_tw_recycle和tcp_timestamps的一些知识(转)
    Xtrabackup 热备
  • 原文地址:https://www.cnblogs.com/gaojs/p/15584376.html
Copyright © 2011-2022 走看看