矩阵链乘(解析表达式)

题目

输入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 }

 

posted @ 2018-10-11 19:41  Rogn  阅读(930)  评论(0编辑  收藏  举报