矩阵链乘(解析表达式)
题目
输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果无法进行乘法,输出error.假定A是m*n矩阵,B是n*p矩阵,则乘法次数为m*n*p;如果A的列数不等于B的行数,则乘法无法进行。
解题思路
本体的关键是解析表达式。本题的表达式比较简单,可以用一个栈来完成:遇到字母时直接入栈,遇到右括号时出栈(出栈两个并计算,然后将结果入栈)。因为输入保证合法,左括号不用管。
代码实现
1 #include<stdio.h> 2 #include<stack> 3 #include<string> 4 #include<iostream> 5 using namespace std; 6 7 struct Matrix 8 { 9 int a, b; 10 Matrix(int a = 0,int b = 0):a(a),b(b) {} 11 }m[26]; 12 13 stack<Matrix>s; 14 15 int main() 16 { 17 int n; 18 scanf("%d", &n); 19 for (int i = 0; i < n; i++) 20 { 21 char name[10]; 22 scanf("%s", name); 23 int k = name[0] - 'A'; 24 scanf("%d%d", &m[k].a, &m[k].b); 25 } 26 string expr; 27 while (cin >> expr) 28 { 29 int len = expr.length(); 30 bool flag = false; 31 int res = 0; 32 for (int i = 0; i < len; i++) 33 { 34 char ch = expr[i]; 35 if (isalpha(ch)) s.push(m[ch - 'A']); 36 if (ch == ')') 37 { 38 Matrix m1 = s.top(); s.pop(); 39 Matrix m2 = s.top(); s.pop(); //注意顺序,m2其实在m1前面 40 s.push(Matrix(m2.a, m1.b)); 41 if (m2.b != m1.a) { flag = true; break; } 42 res += m2.a * m2.b * m1.b; 43 } 44 } 45 if (flag) printf("error\n"); 46 else printf("%d\n", res); 47 } 48 return 0; 49 }
个性签名:时间会解决一切