本题是中缀表达式求值的变形。需要用到数栈。因为涉及运算为矩阵乘法,而该运算具有结合律,故可以不用符栈存储运算符。运算的时机只有右括号。
本题可以用pair存矩阵情况。并且结合表达式中各矩阵只出现一次的特点,将新矩阵的信息存在乘数对应的矩阵信息上。不过这种做法不适合表达式多次出现同一矩阵的情况,对于这种情况 ,可以采用结构体存储新矩阵。
由于采用修改原矩阵信息的方式,会导致下一个表达式结果错误,故采用记忆初始信息,复制到可修改的数组分离适用于各个表达式的初始信息和运算一个表达式时的矩阵信息变化。
#include<bits/stdc++.h>
using namespace std;
typedef pair<char,pair<int,int> > pii;
typedef long long ll;
pii f[27],a[27];
int main(){
int n;
freopen("test.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++)
{
char t;
int b,c;
cin>>t>>b>>c;
f[t-'A'].first=t;
f[t-'A'].second.first=b;
f[t-'A'].second.second=c;
}
string s;
while(cin>>s){
for(int i=0;i<26;i++) //A-Z映射为0~25
a[i]=f[i];//两个存储内容,a为运算时可修改,f为初始持久化
ll sum=0;
stack<char> temp; //数栈、符栈不能合并使用一个栈,否则无法弹出对应符号时保证数缓存的顺序
//由于矩阵乘法满足结合律,故可以不考虑符栈缓存,对每个符号进行判断就能运算
int flag=1;
for(int i=0;s[i];i++)//string的结束可以用\0=0判断。
{
if(isalpha(s[i])) {
temp.push(s[i]);
}
else if(s[i]==')')//右括号优先级最低,此时应当运算。本题只有此时可以运算
{
char t1,t2;
t1=temp.top();temp.pop();
t2=temp.top();
if(a[t2-'A'].second.second==a[t1-'A'].second.first)
{
sum+=a[t1-'A'].second.first*a[t1-'A'].second.second*a[t2-'A'].second.first;
a[t2-'A'].second.second=a[t1-'A'].second.second;//修改存储内容导致在其他组的结果出错
}
else{
flag=0;
break;
}
}
}
if(flag)cout<<sum<<endl;
else cout<<"error"<<endl;
}
return 0;
}