这还是一个栈的问题。
通过给出的表达式,首先声明不会出现(A*B*C)像这样的情况,线性代数不允许这样。
所以通过将字母对应的矩阵入栈。当遇到右括号时有唯一匹配,所以可以取出栈顶两个元素运算。
1 #include <iostream> 2 #include <stack> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 struct Matrix { 8 int a, b; 9 Matrix(int a = 0, int b = 0):a(a),b(b){} 10 11 }m[26]; 12 13 stack<Matrix> s; 14 15 int main () { 16 int n; 17 cin >> n; 18 for (int i = 0; i < n; ++ i) { 19 string name; 20 cin >> name; 21 int k = name[0] - 'A'; 22 cin >> m[k].a >> m[k].b; 23 } 24 25 string expr; 26 while(cin >> expr) { 27 int len = expr.length(); 28 bool error = false; 29 int ans = 0; 30 for (int i = 0; i < len; ++ i) 31 { 32 if (isalpha(expr[i])) s.push(m[expr[i] - 'A']);//是字母入栈 33 else if(expr[i] == ')') {//出栈并判断运算入栈。 34 Matrix m2 = s.top(); s.pop(); 35 Matrix m1 = s.top(); s.pop(); 36 if (m1.b != m2.a ) { 37 error = true; 38 break; 39 } 40 ans += m1.a * m1.b * m2.b; 41 s.push(Matrix(m1.a, m2.b)); 42 } 43 } 44 if(error) cout << "error" << endl; 45 else cout << ans << endl; 46 } 47 return 0; 48 } 49 50 51 52 53 54