int型的栈,偷个懒,把括号也往里面放。
从头开始,左括号入栈;字母,也就是它代表的矩阵,行、列数入栈;右括号不入栈,并且前两个字母对应的行列数和一个左括号出栈,这两个字母矩阵相乘(记录乘法量)得到新的矩阵,行、列数入栈(这个新的行数是出栈的两个矩阵里前者的行数,新的列数是后者的列数,重温一下两个矩阵相乘的法则即可)。直到栈空,计算完成。
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n; cin>>n; 
    vector< pair<int,int> > V1;  //V1存储矩阵的行列数
    for(int i = 0; i < n; i++)
    {
        pair<int, int> P1;
        cin>>P1.first; 
        cin>>P1.second;
        V1.push_back(P1);       
    }
    string str; cin>>str;
    stack<int> S1;
    int tp1, tp2, tp3, ans = 0; 
    int m=0;
    for(int i = 0; i < str.length(); i++)
    {
        if(str[i] == '(')    // '(' 入栈
            S1.push(str[i]);
        if(isalpha(str[i]))  // 字母所对应的行列值入栈       
        {
            S1.push(V1[m].first);
            S1.push(V1[m].second);
            m++;
        }    
        if(str[i] == ')')   // ')' 往前两个字母对应的行列出栈,再往前的一个'('出栈,所以pop*5
        {
            tp1 = S1.top(); S1.pop();
            tp2 = S1.top(); S1.pop();S1.pop();
            tp3 = S1.top(); S1.pop();S1.pop();
            ans +=tp1*tp2*tp3;  //出栈的两个字母所代表的矩阵相乘计算量,
            if(!S1.empty())    //判断计算是否完成
            {
                S1.push(tp3);  //出栈的两个矩阵得到tp3*tp1的新矩阵,行列数入栈
                S1.push(tp1);  
            }
        }      
    }
    cout<<ans;
    return 0;
}