矩阵乘法 :只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p)。
哎 自己数据结构学得太菜了 有思路 做了一上午才做出来 多练习练习
题意:计算矩阵乘法的次数 不满足条件的输出error
建一个栈来做 从头压入栈 满足的就先计算 要是相邻的两个不满足矩阵乘法直接跳出 输出error 否则把乘法的次数算出来累加起来 然后把计算出来的这个新矩阵压入栈中(我的方法是记录次序压入 因为不知道有多少个 要是多的话怕字母不够存 而且也可以当下标访问 我感觉是比较方便的 ) 反复运算 直到读到表达式的末尾
#include<cstdio>
#include<cstring>
#include<cctype>
#include<stack>
using namespace std;
int T;
struct Matrix
{
char s;
int r,c,l;
} M[300],num[300];
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int n;
scanf("%d\n",&n);
for(int i = 0; i < n; i++)
{
scanf("%c%d%d\n",&M[i].s,&M[i].r,&M[i].c);
M[i].l = i;
}
char str[300];
while(gets(str)!=NULL)
{
if(isupper(str[0]))
{
printf("0\n");
continue;
}
stack<int> s;
int sum = 0;
int flag = 1,v = 1;
T = n;
for(int i = 0; i < strlen(str)&&flag; i++)
{
if(str[i]==')')v++;
if(v == 2)
{
int j = 0;
while(s.top()!=40&&!s.empty())
{
num[j].r = M[s.top()].r;
num[j].c = M[s.top()].c;
s.pop();
j++;
}
if(j == 1||j == 0||s.empty())flag = 0;
else
{
s.pop();
int r,c;
c = num[j-1].c;
r = num[j-1].r;
for(int k = j-1; k >=1&&flag; k--)
{
if( c != num[k-1].r)
{
flag = 0;
break;
}
sum += r*c*num[k-1].c;
c = num[k-1].c;
}
if(flag)
{
M[T].l = T;M[T].r = r;M[T].c = c;
s.push(T);
T++;
}
}
v = 1;
}
else
{
for(int k = 0; k < n; k++)
if(str[i] == M[k].s)s.push(k);
if(str[i]=='(')s.push(40);
}
}
while(!s.empty())s.pop();
if(flag)printf("%d\n",sum);
else printf("error\n");
}
return 0;
}