#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main(){
//stack declaration for integers
stack<int> varStack;
string usrInput;
/*
* Separate string to concatenate multi-digit int
* Used in default case for first appearance of an int in user input
*/
string multiDigitVar;
//integers for evaluation
int var1, var2, answer;
//Accept user input as entire line
cout << "Please enter your equation in Reverse Polish Notation: ";
getline(cin, usrInput);
cout << endl;
//FOR loop continuing length of user input
for(int i = 0; i < usrInput.length(); i++)
{
//necessary integer to convert string to int
int convertedVar;
switch(usrInput[i]){
case '+': //addition
var2 = varStack.top();
varStack.pop();
var1 = varStack.top();
varStack.pop();
answer = var1 + var2;
varStack.push(answer);
break;
case '-': //subtraction
var2 = varStack.top();
varStack.pop();
var1 = varStack.top();
varStack.pop();
answer = var1 - var2;
varStack.push(answer);
break;
case '*': //multiplication
var2 = varStack.top();
varStack.pop();
var1 = varStack.top();
varStack.pop();
answer = var1 * var2;
varStack.push(answer);
break;
case '/': //division
var2 = varStack.top();
varStack.pop();
var1 = varStack.top();
varStack.pop();
answer = var1 / var2;
varStack.push(answer);
break;
case ' ':
//white space in user Input. Do nothing.
break;
default:
if(usrInput[i+1] != ' ') { //tests for multi-digit number in response
int j = i;
while (usrInput[j] != ' ') //while loop adds digits until whitespace appears in index + 1
{
multiDigitVar += usrInput[j]; //form the number by applying each digit
j++; //traverse multi-digit number
i++; //update index counter
}
convertedVar = stoi(multiDigitVar);
varStack.push(convertedVar);
break;
}
//single-digit conversion and insertion
convertedVar = usrInput[i] - '0'; //convert character to int using special technique
varStack.push(convertedVar);
break;
}
//reset multi-digit string for next appearance of multi-digit int
multiDigitVar = ' ';
}
//output result
cout << "The result of your equation is: ";
cout << varStack.top();
cout << endl;
}