C++ Notes: Example - RPN Calculator

A RPN (Reverse Polish Notation) Calculator.
```// stl/rpn.cpp -- RPN (Reverse Polish Notation) Calculator
// Fred Swartz 2001-12-05, 2002-09-27
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
using namespace std;

int pop(vector<int>& stk);  //--- prototype to pop stack

//============================================================= main
int main() {
vector<int> opndStack; // vector used as operand stack
string token;          // to read number or operator

while (cin >> token) {
if (isdigit(token[0])) { // if first is digit, it's number.
opndStack.push_back(atoi(token.c_str())); // convert, push

} else { // If it's not a number, assume it's an operator
int left, right;  //  used by some operators as temps

switch (token[0]) {  // assume operators are one char
case '+': opndStack.push_back(pop(opndStack) + pop(opndStack));
break;
case '-': right = pop(opndStack); // get right operand
left  = pop(opndStack); // get left operand
opndStack.push_back(left - right);
break;
case '*': opndStack.push_back(pop(opndStack) * pop(opndStack));
break;
case '/': right = pop(opndStack); // get right operand
left  = pop(opndStack); // get left operand
opndStack.push_back(left / right);
break;
default:  throw domain_error("Undefined operator");
}
cout << "Result: " << opndStack.back() << endl;
}
}
return 0;
}//end main

//============================================================== pop
// This utility function checks stack for underflow
// and pops (removes and returns) last element.
int pop(vector<int>& stk) {
if (stk.empty()) {
throw underflow_error("Stack underflow.");
}
int result = stk.back();
stk.pop_back();
return result;
}//end pop```

Notes

This uses a <vector> rather than the <stack> class. Why? The stack class doesn't check for stack underflow, and has an awkward pop function (two calls necessary to pop), and, while not a great disadvantage, is based by default on deque, which is slightly less efficient than vector. It's not a pleasant class to use. The "right" way to do this is to define one's own template stack class to correct these problems. Hmmm, sounds like a good student problem.