这个题很。。。写3个小时。。。
就是用一个栈模拟一下表达式的堆砌,将表达式中符号变为数值,压入栈中,然后在遇到‘)’时,将值弹出乘以相应的倍数,再压入栈中。
#include<iostream>
#include<string>
#include<map>
#include<ctype.h>
using namespace std;
map<string,int> word_v;
int stack[100];
int top;
int main()
{
string name;
int v;
while(1)
{
cin>>name;
if(name.compare("END_OF_FIRST_PART")==0)
break;
cin>>v;
word_v[name]=v;
}
string f;
while(1)
{
int sum,top=0,unknow=0;
memset(stack,0,sizeof(stack));
string temp;
cin>>f;
if(f[0]=='0')
return 0;
for(int i=0;i<f.length();i++)
{
temp.clear();
if(isupper(f[i]))
{
temp+=f[i];
if(i+1<=f.length()-1&&islower(f[i+1]))
{
temp+=f[i+1];
if(word_v[temp]==0)
{
cout<<"UNKNOWN"<<endl;
unknow=1;
break;
}
if(i+2<=f.length()-1&&isdigit(f[i+2]))//大写+小写+数字
{
int number;
if(i+3<=f.length()-1&&isdigit(f[i+3]))
{
number=(f[i+2]-'0')*10+(f[i+3]-'0');
}
else number=f[i+2]-'0';
stack[++top]=word_v[temp]*number;
i+=2;
continue;
}
//大写+小写后面无数字
stack[++top]=word_v[temp];
++i;
continue;
}
if(word_v[temp]==0)
{
cout<<"UNKNOWN"<<endl;
unknow=1;
break;
}
if(i+1<=f.length()-1&&isdigit(f[i+1]))
{
int number;
if(i+2<=f.length()-1&&isdigit(f[i+2]))//大写+数字
{
number=(f[i+1]-'0')*10+(f[i+2]-'0');
}
else number=f[i+1]-'0';
stack[++top]=word_v[temp]*number;
++i;
continue;
}
stack[++top]=word_v[temp];//大写后面无数字
}
else if(f[i]=='(')
{
stack[++top]=-2;
}
else if(f[i]==')')
{
int tempsum=0;
int number=f[i+1]-'0';
while(stack[top]!=-2)
{
tempsum+=stack[top];
--top;
}
if(i+2<=f.length()-1&&isdigit(f[i+2]))
number=(f[i+1]-'0')*10+(f[i+2]-'0');
tempsum=tempsum*number;
stack[top]=tempsum;
++i;
}
}
if(!unknow)
{
int an=0;
for(int i=0;i<=top;i++)
an+=stack[i];
cout<<an<<endl;
}
}
return 0;
}