题意:A,B,C...表示矩阵,分别有row和col两个属性,计算表达式中需要进行乘法运算的次数
假如A :50*10 , B :10*20, C :20*30,那么ABC需要进行乘法运算的次数为50*10*20+50*20*30;
在表达式的处理上,一是要注意括号的处理,二是更新矩阵的row和col
思路:先判断表达式是否能进行矩阵乘法运算(观察可得,从左往右直接比较即可,若相邻两个矩阵不能进行乘法运算,输出“error”),如果可以运算,先处理括号,左括号开始入栈,右括号开始出栈,如果栈里元素达到2个时,将其合并,在sum上加上需要运算的次数,并更新新的矩阵的row和col
如果思路理顺了,代码还是非常好写的
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
typedef struct matrix
{
char name;
int row;
int col;
} matrix;
matrix m[1000];
matrix stack1[1000];
int ins[26][2];
char a[1000],b[1000],stack2[1000];
int main()
{
int j,n,sum,top1,top2;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>m[i].name;
cin>>m[i].row>>m[i].col;
}
while(cin>>a)
{
j=0,sum=0,top1=-1,top2=-1;
for(int i=0; i<(int)strlen(a); i++)
if(isupper(a[i]))
{
b[j]=a[i];
j++;
}
b[j]='\0';
int flag=0;
for(int i=0; i<(int)strlen(b)-1; i++)
if(m[b[i]-'A'].col!=m[b[i+1]-'A'].row)
{
flag=1;
break;
}
if(flag==1)
{
puts("error");
continue;
}
else
{
for(int i=0; i<(int)strlen(a); i++)
{
if(isalpha(a[i]))
{
top1++;
stack1[top1]=m[a[i]-'A'];
}
if(a[i]=='(')
{
top2++;
stack2[top2]='(';
}
if(a[i]==')')
{
top2--;
sum+=stack1[top1].row*stack1[top1].col*stack1[top1-1].row;
top1--;
stack1[top1].col=stack1[top1+1].col;
}
}
cout<<sum<<endl;
}
}
return 0;
}