/*
问题:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果无法进行,输出error.如果A是m*n矩阵,B是n*p的矩阵,乘法次数为m*n*p
如果A的列数不等于B的行数,则乘法无法进行.
解题思路:利用结构体存储矩阵的行数和列数,然后利用stack 进行运算 遇见字母进栈,遇见右括号出栈 计算
样例输入:
9
A 50 10
B 10 20
C 20 5
D 30 35
E 35 15
F 15 5
G 5 10
H 10 20
I 20 25
A
B
C
(AA)
(AB)
(AC)
(A(BC))
((AB)C)
(((((DE)F)G)H)I)
(D(E(F(G(HI)))))
((D(EF))((GH)I))
样例输出:
0
0
0
error
10000
error
3500
15000
40500
47500
15125
*/
#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
struct Matrix{
int a,b;//分别是结构体的行数和列数
Matrix(int na=0,int nb=0){//结构体的构造方法
a=na;
b=nb;
}
} m[26];
stack<Matrix> s;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++){
string name;//就只包含一个字符A ,B等
cin>>name;
int k=name[0]-'A';//把字符转成数字
cin>>m[k].a>>m[k].b;//输入矩阵的行数和列数
}
string expr;//需要计算的表达式
while(cin>>expr){
int len=expr.length();//长度
bool error=false;//flag
int ans=0;//结果
for(int i=0;i<len;i++){//遍历表达式的每一个元素
//若是字母 把相应的矩阵的压进栈
if(isalpha(expr[i]))s.push(m[expr[i]-'A']);
//若是右括号 进行抛出栈的元素进行计算
else if(expr[i]==')'){
Matrix m2=s.top();//获取栈顶元素
s.pop();//抛出栈顶元素
Matrix m1=s.top();
s.pop();
//判断是否能够计算 当左的列=右的行时 才能计算
if(m1.b!=m2.a){
error=true;
break;
}
ans+=m1.a*m1.b*m2.b;//计算结果
s.push(Matrix(m1.a,m2.b));//结果作为新的矩阵 压进栈
}
}
if(error)printf("error
");
else printf("%d
",ans);
}
return 0;
}