问题: 
 输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数.如果无法进行,输出error.如果A是m*n矩阵,B是n*p的矩阵,乘法次数为m*n*p 如果A的列数不等于B的行数,则乘法无法进行. 
 A 50*10 
 B 10*20 
 C 20*5 
 (A(BC))乘法次数:10*20*5(BC乘法次数)+50*10*5(A(BC)的乘法次数)
样例输入:
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
分析与解答: 
 stack先进后出,如果加一个终止条件,可以控制输出时机 
 刚好这个是两个数捆在一起了,那么只要找到终止条件就可以得到一个数,而不用考虑最先进栈的是个什么数
1.遇见字母进栈,遇见右括号出栈 
 2.出栈后栈顶的数是m2栈顶下面那个数m1 
 通过判断,m2.a和m1.b,看是否能乘 
 3.成之后形成一个新矩阵m1.a,m2.b,push到stack里 
 4.注释:结构数组只不过类似int[a]的作用,只是输入到stack里的一个跳板,真正存东西的是stack
#include<cstdio>
#include<stack>
#include<iostream>
#include<string>
using namespace std;struct matrix{int a,b;//行,列 matrix(int a=0,int b=0) :a(a),b(b){}//子类调用父类;//复制构造函数初始化行列置为零; 
}m[26];stack<matrix> s;int main(){int n;cin>>n;for(int i=0;i<n;++i){string name;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;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();//注意这里m2是顶端 matrix m1=s.top(); s.pop();if(m1.b != m2.a){//m2.a和m1.b error=true; break;}ans+=m1.a*m1.b*m2.b;s.push(matrix(m1.a,m2.b));}}if(error) printf("error\n");else printf("%d\n",ans);}return 0;
}