#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>

#define MAX_OPERAND_NUMBER 100
#define ELEMENT_BUFFER_SIZE 256
#define ELEMENT_SIZE 10

/**
*スタック
*/

class Stack
{
private:

    int aOperands[MAX_OPERAND_NUMBER]; /*スタック本体*/
    int iStackSuffix; /*スタックポインタ*/

public:
    Stack();

    int pop();
    void push(int iPushOperand);

};

Stack::Stack() : iStackSuffix(0)
{
    /*初期化用デフォルトコンストラクタ*/
}

/**
*Stackメンバ関数:Stack::pop
*機能：スタックから要素をpop
*/

int Stack::pop()
{
    return aOperands[--iStackSuffix];           /*ポインタを1デクリメントして値を返す*/
}

/**
*Stackメンバ関数:Stack::push
*機能：スタックに整数をpush
*/

void Stack::push(int iPushOperand)
{
    aOperands[iStackSuffix++] = iPushOperand;   /*値を格納したらポインタをインクリメントする*/
    return;
}


/*通常関数プロトタイプ宣言*/
int InputByGetline(char astrElements[ELEMENT_BUFFER_SIZE][ELEMENT_SIZE]);
void InputExecute(char astrElements[ELEMENT_BUFFER_SIZE][ELEMENT_SIZE], int EleNum);


int main(void)
{
    char astrElements[ELEMENT_BUFFER_SIZE][ELEMENT_SIZE];   /*std::vector<std::string>では上手く作れなかった*/

    int iEleNum = InputByGetline(astrElements);             /*要素を格納しその要素数を取得*/

    InputExecute(astrElements, iEleNum);

    return 0;
}


/**
*関数名：InputByGetline
*機能：入力(1行で受け取る)を区切り文字で分割して配列に格納する
*返り値:iVectorPos:格納した要素数
*/

int InputByGetline(char astrElements[ELEMENT_BUFFER_SIZE][ELEMENT_SIZE])    /**/
{
    std::string strInputBuffer = "\0";  /*入力受け入れ用バッファ*/
    std::string strSplitBuffer = "\0";  /*入力を分解して得た要素のバッファ*/

    std::getline(std::cin, strInputBuffer);

    int iInputBufferPos = 0;            /*入力された文字列の位置*/
    int iVectorPos = 0;                 /*配列中の位置：要素数に対応*/
    int iStringPos = 0;                 /*要素中文字の位置*/

    while( iVectorPos < ELEMENT_BUFFER_SIZE )
    {
        if(strInputBuffer[iInputBufferPos] == '\0' || strInputBuffer[iInputBufferPos] == ' ')
        {
            astrElements[iVectorPos][iStringPos] = '\0';                                /*iVectorPos番目の終端文字付加*/
            iVectorPos++;
            iStringPos = 0;

            if(strInputBuffer[iInputBufferPos] == '\0')
            {
                break;                                                                  /*入力の終わりまで来たら終了*/
            }
        }
        else
        {
            astrElements[iVectorPos][iStringPos] = strInputBuffer[iInputBufferPos];     /*区切り文字以外は格納*/
            iStringPos++;
        }

        iInputBufferPos++;
    }
    return iVectorPos;
}

/**
*関数名：InputExecute
*機能：入力内容に沿って演算を行う
*/

void InputExecute(char aElements[ELEMENT_BUFFER_SIZE][ELEMENT_SIZE], int EleNum)
{
    Stack clsStackCalc;
    
    int iCalcBuffer = 0;

    for (int i = 0; i < EleNum; i++)
    {
        /*読みだした要素が演算子であればスタックから値を取り出して演算*/
        if (aElements[i][0] == '+')
        {
            iCalcBuffer = clsStackCalc.pop();
            clsStackCalc.push(clsStackCalc.pop() + iCalcBuffer);    /*LIFOなので先に取り出した被演算子を後ろに置く*/
        }
        else if (aElements[i][0] == '-')
        {
            iCalcBuffer = clsStackCalc.pop();
            clsStackCalc.push(clsStackCalc.pop() - iCalcBuffer);
        }
        else if (aElements[i][0] == '*')
        {
            iCalcBuffer = clsStackCalc.pop();
            clsStackCalc.push(clsStackCalc.pop() * iCalcBuffer);
        }
        else
        {
            clsStackCalc.push(std::atoi(aElements[i]));             /*被演算子を読みだしたらスタックにpushする*/
        }
    }

    std::cout << clsStackCalc.pop() << std::endl;                   /*スタックに格納された最終結果を表示*/

    return;
}



Measured memory_bytes: 3184