#include <list>
#include <vector>
#include <map>
#include <functional>
#include <iostream>
#include <algorithm>
#include <initializer_list>
class program {
typedef std::list <int> args_t;
typedef std::function<int(int,int)> op_t;
typedef std::vector <op_t> code_t;
args_t args;
code_t code;
public:
void compile (const std::string& expr) {
static std::map <char, op_t> op_map = {
{'+', std::plus<int>() }
,{'-', std::minus<int>() }
};
for (auto c: expr) {
isdigit(c) ?
args.push_back (c-'0')
: code.push_back (op_map[c]);
}
}
int next_arg () {
int arg = *args.begin (); args.pop_front();
return arg;
}
int run () {
for (auto op: code) {
int lhs = next_arg();
int rhs = next_arg();
args.push_front (op (lhs, rhs));
}
return next_arg();
}
};
int main()
{
program p;
p.compile ("7+3-2+5");
int result = p.run ();
std::cout << result; // 13
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgoKY2xhc3MgcHJvZ3JhbSB7Cgl0eXBlZGVmIHN0ZDo6bGlzdCA8aW50PiBhcmdzX3Q7Cgl0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248aW50KGludCxpbnQpPiBvcF90OwoJdHlwZWRlZiBzdGQ6OnZlY3RvciA8b3BfdD4gY29kZV90OwoJCglhcmdzX3QgYXJnczsKCWNvZGVfdCBjb2RlOwoJCglwdWJsaWM6CgkKCXZvaWQgY29tcGlsZSAoY29uc3Qgc3RkOjpzdHJpbmcmIGV4cHIpIHsKCSAgc3RhdGljIHN0ZDo6bWFwIDxjaGFyLCBvcF90PiBvcF9tYXAgPSB7CgkgIAl7JysnLCBzdGQ6OnBsdXM8aW50PigpIH0KCSAgICx7Jy0nLCBzdGQ6Om1pbnVzPGludD4oKSB9CgkgIH07CgkKCSAgZm9yIChhdXRvIGM6IGV4cHIpIHsKCSAgICBpc2RpZ2l0KGMpID8gCgkgICAgCWFyZ3MucHVzaF9iYWNrIChjLScwJykgCgkgICAgICA6IGNvZGUucHVzaF9iYWNrIChvcF9tYXBbY10pOwoJICB9Cgl9CgoJaW50IG5leHRfYXJnICgpIHsKCQlpbnQgYXJnID0gKmFyZ3MuYmVnaW4gKCk7IGFyZ3MucG9wX2Zyb250KCk7CgkJcmV0dXJuIGFyZzsKCX0KCglpbnQgcnVuICgpIHsKCSAgZm9yIChhdXRvIG9wOiBjb2RlKSB7CgkJaW50IGxocyA9IG5leHRfYXJnKCk7CgkgIAlpbnQgcmhzID0gbmV4dF9hcmcoKTsKCSAgICBhcmdzLnB1c2hfZnJvbnQgKG9wIChsaHMsIHJocykpOwoJICB9CgkgIHJldHVybiBuZXh0X2FyZygpOwoJfQp9OwoKaW50IG1haW4oKQp7CgogIHByb2dyYW0gcDsKICBwLmNvbXBpbGUgKCI3KzMtMis1Iik7CiAgaW50IHJlc3VsdCA9IHAucnVuICgpOwogIHN0ZDo6Y291dCA8PCByZXN1bHQ7IC8vIDEzCn0K