題意:輸入不超過26個矩陣的行數和列數,接著來一些表達式詢問,求各條表達式需要多少次基本運算。
——>>用STL開2個棧,一個用來存“(”,一個用來存儲矩陣,掃描表達式,當碰到矩陣時,放入矩陣棧;當碰到“(”時,放入符號棧;當碰到“)”的時候,從矩陣棧中取(退)2個矩陣相乘並記錄乘法次數和,並將相乘後的矩陣放入矩陣棧,從符號棧中刪除1個“(”,最後輸出結果即可。
[cpp]
#include <iostream>
#include <stack>
using namespace std;
struct Matrix //矩陣類型,包括行數和列數
{
int row; //行數
int col; //列數
};
int main()
{
int n, i; //n為輸入的矩陣個數
Matrix mat[30]; //用來存儲各個單矩陣(最多只有26個,所以開30的空間有了!!!)
char c;
cin>>n;
for(i = 0; i < n; i++)
{
cin>>c;
int index = (int)(c-'A'); //讓矩陣數組的下標0,1,2...就標志著A,B,C...
cin>>mat[index].row>>mat[index].col; //存入對應的行數和列數
}
string s; //以字符串的形式輸入每行測試數據
while(cin>>s)
{
long long sum = 0; //基本乘法數之和,初始為0
int len = s.length();
stack<char> st_sign; //該棧用來存儲"("
stack<Matrix> st_node; //該棧用來存儲"矩陣"
int ok = 1; //ok用來標志是否出現error的現象
for(i = 0; i < len; i++) //掃描各個字符
if(s[i] == ')') //當出現")"時,必有"("與其對應
{
int right_value = st_node.top().col; //從棧中取出矩陣數據,右矩陣的列數
int mid_value_right = st_node.top().row; //右矩陣的行數
st_node.pop();
int left_value = st_node.top().row; //從棧中取出矩陣數據,左矩陣的行數
int mid_value_left = st_node.top().col; //左矩陣的列數
if(mid_value_left != mid_value_right) //當 左矩陣的列數 != 右矩陣的行數 時
{
ok = 0;
break;
}
st_node.pop();
st_sign.pop();
sum += left_value * mid_value_left * right_value; //累加基本乘法次數
Matrix newmat;
newmat.row = left_value;
newmat.col = right_value;
st_node.push(newmat); //新建一個矩陣,行數為左矩陣的行數,列數為右矩陣的列數,進棧
}
else if(s[i] == '(') //碰到"("直接放入符號棧即可
st_sign.push('(');
else //當掃到字母即矩陣的時候
{
int new_index = (int)(s[i]-'A'); //轉換下標
st_node.push(mat[new_index]); //將該矩陣放入矩陣棧
}
if(ok)
cout<<sum<<endl;
else
cout<<"error"<<endl;
}
return 0;
}