// Calculadora en notación postfija: un uso de la pila que no sabe cómo está hecha.
#include <cassert>
#include <iostream>
#include <string>
#include <vector>

#include "vector_stack.h"

int eval_postfix(const std::vector<std::string>& tokens) {
    VectorStack<int> values;
    for (const std::string& token : tokens) {
        if (token == "+" || token == "-" || token == "*") {
            assert(values.size() >= 2);
            int right = values.top();
            values.pop();
            int left = values.top();
            values.pop();
            if (token == "+") {
                values.push(left + right);
            } else if (token == "-") {
                values.push(left - right);
            } else {
                values.push(left * right);
            }
        } else {
            values.push(std::stoi(token));
        }
    }
    assert(values.size() == 1);
    return values.top();
}

int main() {
    std::cout << eval_postfix({"3", "4", "+", "2", "*"}) << "\n";
    std::cout << eval_postfix({"10", "2", "3", "*", "-"}) << "\n";
    return 0;
}
