//解题思路,逐个字符解析计算法则的字符串 //1.遇到'('直接跳过,看下一个元素 //2.遇到字母,入栈。若下一个字符也是字母,出栈一个元素与下一个矩阵直接计算出结果, // 然后将计算后的矩阵入栈,直到下一个不是字母。 //3.遇到字母,入栈。若下一个字符不是字母,直接看下一个字符 //4.遇到')',如果是第一个,则跳过,如果不是第一个,则计算栈最上面两个矩阵的乘法次数,并累加 #include<iostream> #include<stack> #include<vector> #include<string> using namespace std; int fun(int n) { vector<pair<int,int>> v;//存矩阵 pair<int,int> p; while(n--) { cin>>p.first>>p.second; v.push_back(p); } string str;//存计算法则 cin>>str; int num=0;//用来存乘法次数 stack<pair<int,int>> s;//栈,存计算后的矩阵 pair<int,int> p_tmp;//临时元素,存临时矩阵 int count=0;//用来标记')‘个数 for(int i=0;i<str.size();) { if(str[i]=='(') //遇到'('直接跳过,看下一个元素 { i++; continue; } if(str[i]>='A'&&str[i]<='Z') { { s.push(v[str[i]-'A']);//遇到字母,入栈。 } //若下一个字符也是字母,出栈一个元素与下一个矩阵直接计算出结果, //然后将计算后的矩阵入栈,直到下一个不是字母。 while((i+1)<str.size()&&str[i+1]>='A'&&str[i+1]<='Z') { p_tmp.first=s.top().first; p_tmp.second=v[str[i+1]-'A'].second; num+=s.top().first*s.top().second*v[str[i+1]-'A'].second; s.pop(); s.push(p_tmp); i++; } //若下一个字符不是字母,直接看下一个字符 i++; continue; } if(str[i]==')') { //遇到')',如果是第一个,则跳过,如果不是第一个,则计算栈最上面两个矩阵的乘法次数,并累加 if(count==0&&(i+1)<str.size()) { count++; i++; continue; } if(s.size()>1)//栈中有多个元素,需要计算最上面两个矩阵 { p_tmp.first=s.top().first; p_tmp.second=s.top().second; s.pop(); num+=s.top().first*s.top().second*p_tmp.second; p_tmp.first=s.top().first; s.pop(); s.push(p_tmp); i++; continue; } if(s.size()==1)//栈中只有一个元素则不用计算了 { cout<<num<<endl; return 0; } } } cout<<num<<endl;//最后输出乘法次数 return 0; } int main() { int n; while(cin>>n) { fun(n); } }