主要思路就是一个递归。写了一个solution函数,碰到括号就往里面一扔。
比赛的时候犯了不少错误。
.stack得写里面,因为是递归,要生成新的stack,不能混用
.要注意每个操作里i最后会发生什么变化,要是需要加多少的就加
#include<bits/stdc++.h> #define ll long long using namespace std; int n,m,sm; ll res; string s ,str; unordered_map<string,int> um; int solution(string x){ stack<int> stk; int len = x.size(); ll res = 0; for(int i=0;i<len;i++){ if(x[i]=='('){ int zuo=1 , j; for( j=i+1;zuo;j++){ if(x[j]=='(') zuo++; if(x[j]==')') zuo--; } stk.push(solution(x.substr(i+1,j-i-1))); i=j-1; } else if(x[i]>='0' && x[i]<='9'){ int tmp=x[i]-'0'; while(i+1<len && x[i+1]>='0' && x[i+1]<='9'){ tmp=tmp*10+x[i+1]-'0'; i++; } int ttmp = tmp*stk.top(); stk.pop(); stk.push(ttmp); } else if(x[i]>='A' && x[i]<='Z'){ if(um[x.substr(i,2)]){ stk.push(um[x.substr(i,2)]); i++; } else if(um[x.substr(i,1)]){ stk.push(um[x.substr(i,1)]); } } } while(!stk.empty()){ res += stk.top(); stk.pop(); } return res; } int main(){ cin>>m>>n; while(m--){ cin>>s>>sm; um[s]=sm; } while(n--){ cin>>str; cout<<solution(str)<<endl; } return 0; }