题解 | #矩阵乘法计算量估算#

矩阵乘法计算量估算

https://www.nowcoder.com/practice/15e41630514445719a942e004edc0a5b

#include <iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;

//矩阵乘法计算量估算
class EstimaMatrixMulti {
  private:
    //矩阵数量
    int n;

    //每个矩阵的行数和列数
    vector<pair<int, int>> vpii;
    stack<pair<int, int>> spii;

    //计算法则(算式)
    string rules;
    stack<char> sc;

  public:
    //构造函数
    EstimaMatrixMulti(const int n);

    //析构函数
    ~EstimaMatrixMulti();

    //估算计算量
    const int EstimatCalcQuant(void);
};

EstimaMatrixMulti::EstimaMatrixMulti(const int n) {
    this->n = n;
    this->vpii.clear();
    pair<int, int> pii;
    for (int i = 0; i < n; i++) {
        cin >> pii.first >> pii.second;
        this->vpii.push_back(pii);
    }

    //清空栈
    while (!this->spii.empty()) {
        this->spii.pop();
    }

    cin >> this->rules;
    while (!this->sc.empty()) {
        this->sc.pop();
    }
    return;
}

EstimaMatrixMulti::~EstimaMatrixMulti() {
}

const int EstimaMatrixMulti::EstimatCalcQuant(void) {
    //计算量
    int CalcQuant = 0;
    //数组下标
    int j = 0;

    //根据计算规则进行估算
    for (int i = 0; i < this->rules.size(); i++) {
        //如果遇到括号,不进行计算,直接入符号栈
        if (this->rules[i] == '(') {
            this->sc.push(this->rules[i]);
            continue;
        }
        // 如果遇到代表矩阵的大写字母,查看符号栈顶
        // 如果符号栈顶也是矩阵,进行一次计算,更新计算量和数组下标并将数据栈顶改为结果矩阵
        // 否则入栈,更新数组下标
        if (('A' <= this->rules[i]) && (this->rules[i] <= 'Z')) {
            //先判断栈是否为空,避免取栈顶出错
            if ((this->sc.empty()) || (this->sc.top() == '(')) {
                this->sc.push(this->rules[i]);
                this->spii.push(this->vpii[j]);
                j++;
                continue;
            }
            if (('A' <= this->sc.top()) && (this->sc.top() <= 'Z')) {
                CalcQuant += this->spii.top().first * this->vpii[j].second *
                             this->spii.top().second;
                this->spii.top().second = this->vpii[j].second;
                j++;
                continue;
            }
        }
        // 如果遇到右括号,符号栈出栈两次,得到矩阵,判断符号栈顶
        // 如果是矩阵,数据栈也出栈,将得到的数据与新栈顶进行计算,更新计算量并将数据栈顶改为结果矩阵
        // 否则将得到的矩阵符号入栈
        if (this->rules[i] == ')') {
            char ch = this->sc.top();
            this->sc.pop();
            this->sc.pop();
            if ((this->sc.empty()) || (this->sc.top() == '(')) {
                this->sc.push(ch);
                continue;
            }
            if (('A' <= this->sc.top()) && (this->sc.top() <= 'Z')) {
                pair<int, int> pii(this->spii.top());
                this->spii.pop();
                CalcQuant += this->spii.top().first * pii.second * pii.first;
                this->spii.top().second = pii.second;
                continue;
            }
        }
    }
    return CalcQuant;
}

int main() {
    int a;
    while (cin >> a) { // 注意 while 处理多个 case
        cout << EstimaMatrixMulti(a).EstimatCalcQuant() << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

重生我想学测开:嵌入式的问题,我准备入行京东外卖了
点赞 评论 收藏
分享
04-28 22:33
已编辑
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务