AcWing 448. 表达式的值pair版本
原题链接
中等
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <stack>
using namespace std;
#define x first
#define y second
typedef long long LL;
typedef pair<int, int> PII;
unordered_map<char, int> pr{{'+',1},{'*',2}};
stack<char> op ;
stack< PII > num;
const int mod = 10007;
void eval(){
char c = op.top();op.pop();
auto a = num.top(); num.pop();
auto b = num.top(); num.pop();
if(c == '*') {
num.push({ (a.x * b.y + a.x * b.x +
a.y * b.x) %mod , (a.y * b.y)%mod
}) ;
}
if(c == '+'){
num.push({ (a.x * b.x)%mod, (a.x * b.y + a.y * b.y +
a.y * b.x) % mod
}) ;
}
}
int main()
{
int n;
cin >> n;
string s ;
cin>> s ;
num.push({1,1}) ;
for(auto i : s){
if(i == '('){
op.push(i);
}else if (i == ')'){
while(op.top()!='(') eval();
op.pop() ;
}else{
while(op.size() && pr[op.top()] >= pr[i]) eval();
op.push(i);
num.push({1,1});
}
}
while(op.size()) eval();
cout << num.top().x % mod << endl ;
return 0;
}