1. 程式人生 > >矩陣鏈乘(解析表達式)

矩陣鏈乘(解析表達式)

div {} bsp ace mes 結果 pan als 比較

題目

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

矩陣鏈乘(解析表達式)