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

  

上一篇:java – Android,添加没有XML布局的新视图


下一篇:js-递归方法