stack模拟无视左括号,遇到字母就压栈,右括号弹出两个并计算,然后算出来的再压栈。
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
map<char,int>l,r;
stack<PII>stk;
int n;
void Gao()
{
l.clear();
r.clear();
while (!stk.empty())
stk.pop();
cin>>n;
for (int i=0;i<n;i++)
{
char cc;
int ll,rr;
cin>>cc>>ll>>rr;
getchar();
l[cc]=ll;
r[cc]=rr;
}
char a[100000];
while (scanf("%s",a)!=EOF)
{
bool ok=true;
int ans=0;
int len=strlen(a);
for (int i=0;i<len;i++)
{
if (a[i]>='A'&&a[i]<='Z')
stk.push(make_pair(l[a[i]],r[a[i]]));
if (a[i]==')')
{
PII pi1,pi2;
pi2=stk.top();stk.pop();
pi1=stk.top();stk.pop();
if (pi1.second!=pi2.first)
{
ok=false;
break;
}
else
{
ans+=pi1.first*pi1.second*pi2.second;
stk.push(make_pair(pi1.first,pi2.second));
}
}
}
if (!ok)
cout<<"error"<<endl;
else
cout<<ans<<endl;
}
}
int main()
{
//freopen("a.in","r",stdin);
Gao();
return 0;
}