题意:给出矩阵规格, 然后给出矩阵算式, 求每个算式的计算量。当矩阵无法相乘时 输出error
思路:1.计算量的计算方式 (A.r, A.c) * (B.r, B.c) 的计算量是 A.r * A.c * B.c()
2.关键: 用栈在储存矩阵。 遇到 '(' 时读掉, 遇到字母时压栈, 遇到')'时计算栈的顶部两个矩阵, 形成行矩阵压入栈中。
3.用数组保存读入的矩阵, 26个英文字母 对于1~26.
算法复杂度:还不会算。。。
代码:
/*堆栈*/
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
struct SMatrix {
int row;
int col;
static int count;
};
int SMatrix::count = 0;
bool error;
SMatrix mulMatrix(const SMatrix &, const SMatrix &);
int main()
{
SMatrix matrix[26];
memset(matrix, 0, sizeof(matrix));
//enter
int n;
scanf("%d%*c", &n);
for (int i = 0; i < n; i++) {
char ch;
scanf("%c", &ch);
scanf("%d%d%*c", &matrix[ch-'A'].row, &matrix[ch-'A'].col);
}
char ch;
stack<SMatrix> staMat;
error = false;
while (scanf("%c", &ch) != EOF) {
if (ch == '\n') {
if (error) {
printf("error\n");
}else {
printf("%d\n", SMatrix::count);
}
SMatrix::count = 0;
error = false;
}
if (ch >= 'A' && ch <= 'Z') {
staMat.push(matrix[ch-'A']);
}
if (ch == ')' && staMat.size() > 1) {
SMatrix left, right, rslt;
right = staMat.top();
staMat.pop();
left = staMat.top();
staMat.pop();
rslt = mulMatrix(left, right);
staMat.push(rslt);
}
}
return 0;
}
SMatrix mulMatrix(const SMatrix &left, const SMatrix &right)
{
if (left.col != right.row) {
error = true;
return left;
}else {
SMatrix::count += left.row * left.col * right.col;
}
SMatrix rslt;
rslt.row = left.row;
rslt.col = right.col;
return rslt;
}