问题:
输入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;
}