3.矩陣鏈乘
問題描述:
輸入n個矩陣的維度和一些矩陣鏈乘表達式,輸出乘法的次數.如果無法進行,輸出error.如果A是m*n矩陣,B是n*p的矩陣,乘法次數為m*n*p如果A的列數不等于B的行數,則乘法無法進行.
思路:
棧的簡單應用。定義矩陣結構體;輸入矩陣;輸入運算公式;遇到字母進棧;遇到‘)’出棧頂兩元素;如果無法計算則輸出error;如果可以計算則將計算結果入棧更新乘法次數
#include<iostream>
#include<cstdio>
#include<stack>
#include<string>
using namespace std;
struct Matrix {//定義矩陣結構體
int a, 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 length = expr.length();
int ans = 0;
bool state = true;
for(int i=0;i<length;i++){
if(isalpha(expr[i])) s.push(m[expr[i]-'A']);
if(expr[i]==')'){
//棧頂兩元素出棧計算
Matrix m2 = s.top();
s.pop();
Matrix m1 = s.top();
s.pop();
//無法計算
if(m1.b != m2.a){
state = true;
break;
}else{//可以計算
Matrix m;
m.a = m1.a;
m.b = m2.b;
//計算結果入站
s.push(m);
//更新乘法次數
ans += m1.a*m1.b*m2.b;
state = false;
}
}
}
if(state)
cout<< "error" <<endl;
else
cout<< ans <<endl;
}
return 0;
}
測試數據
2
A
2 2
B
2 3
(AB)
12