#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
struct MATRIX
{
int row;
int col;
MATRIX(int row = 0, int col = 0) : row(row), col(col) {}
} matrix[26]; //因为26个英文字母
stack<MATRIX> element;
string letter, expr; //letter 矩阵字母表示 expr 表达式表示
int n, num, ans;
bool flag;
int main()
{
scanf("%d", & n);
while(n --)
{
cin >> letter;
num = letter[0] - 'A'; //变为结构体数组下标
cin >> matrix[num].row >> matrix[num].col; //输入矩阵的 行 列
}
while(cin >> expr) //输入表达式
{
flag = true; //判断是否error
ans = 0;
for(int i = 0; i < (int)expr.length(); i ++)
{
if(isalpha(expr[i])) //如果是字母 就将该字母所表达的矩阵投入栈
element.push(matrix[expr[i] - 'A']);
else if(expr[i] == ')') //计算两个矩阵
{
MATRIX x2 = element.top();
element.pop();
MATRIX x1 = element.top();
element.pop();
if(x1.col != x2.row)
{
flag = false;
break;
}
else
{
ans += x1.row * x1.col * x2.col;
element.push(MATRIX(x1.row,x2.col)); //得到一个新的矩阵再投入栈
}
}
}
if(flag) //如果无错 输出ans
printf("%d\n", ans);
else
printf("error\n");
}
return 0;
}
题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。假定A是m * n矩阵,B是n * p矩阵,那么AB是m * p矩阵,乘法次数为10 * 20 * 5(BC的乘法次数) + 50 * 10 * 5 ((A(BC))的乘法次数) = 3500。
题解:简单的表示式解析可以借助栈来完成。题目说过括号已经完整。所以遇到右括号运算即可。