思路如下:
用栈进行括号配对(即遇到右括号时将两个代表矩阵的字符出栈,否则一直入栈),然后得到矩阵的乘积;
注意:当有并行的括号存在时,需要用两个特殊矩阵进行轮流存储(下面的代码上有注释),还有最后记得要清空栈,否则会影响接下来的数据;
代码如下:
#include<bits/stdc++.h>
using namespace std;
struct pp
{
char name;
int row;
int col;
}m[30];
int y;
int fr(char a)
{
for(int i=0;i<=y+1;i++)
{
if(m[i].name==a)
{
return m[i].row;
}
}
}
int fc(char a)
{
for(int i=0;i<=y+1;i++)
{
if(m[i].name==a)
{
return m[i].col;
}
}
}
int main()
{
cin>>y;
getchar();
for(int i=0;i<y;i++)
{
cin>>m[i].name;
cin>>m[i].row;
cin>>m[i].col;
getchar();
}
m[y].name='!';//这两个结构体即是中间变量存储两个矩阵的乘积
m[y].row=0;
m[y].col=0;
m[y+1].name='@';
m[y+1].row=0;
m[y+1].col=0;
string a;
stack<char> t;
while(getline(cin,a,'\n'))
{
int len=a.size();
long long sum=0;
int flag=1;
int f_t=0;//判断t是否存在
if(len==1)
{
cout<<"0\n";
continue;
}
else
{
for(int i=0;i<len;i++)
{
if(a[i]==')')
{
char zz[2];
int x=0;
while(t.top()!='(')
{
zz[x++]=t.top();
t.pop();
}
t.pop();
int r1,r2,c1,c2;
r1=fr(zz[1]);
r2=fr(zz[0]);
c1=fc(zz[1]);
c2=fc(zz[0]);
if(c1!=r2)
{
flag=0;
break;
}
else
{
sum+=r2*(r1*c2);
if(f_t==0)
{
m[y].row=r1;
m[y].col=c2;
if(t.size()==1)
f_t=1;
t.push('!');
}
else
{
m[y+1].row=r1;
m[y+1].col=c2;
if(t.size()==1)
f_t=0;
t.push('@');
}
}
}
else
t.push(a[i]);
}
if(flag)
cout<<sum<<endl;
else
cout<<"error"<<endl;
while(!t.empty())//这很重要记得要清空栈,否则会影响下一组数据
{
t.pop();
}
}
}
return 0;
}