兄貴の伝説 - hatena edition -

ソフトウェア職人を目指してます

4.2 スタック

std::stack を使えば良いのかな?と思って書いたコードです。

#include <iostream>
#include <string>
#include <stack>
#include <sstream>

using namespace std;

static bool isOperator(const string& st) {
  return st[0] == '+' || st[0] == '-' || st[0] == '*' || st[0] == '/';
}

int main() {
  stack<string> st;
  string  op1, op2, op, line, elem;
  int op1_i, op2_i, ans;
  
  // input line.
  getline(cin, line);
  stringstream ss(line);
  
  // sprit.
  while (getline(ss, line, ' ')) {
    st.push(line);
    elem = st.top();
    if (isOperator(elem)) {
      op = st.top();
      st.pop();
      op2 = st.top();
      st.pop();
      op1 = st.top();
      st.pop();
      op1_i = stoi(op1);
      op2_i = stoi(op2);
      
      switch (op[0]) {
      case '+':
         ans = op1_i + op2_i;
         break;
      case '-':
         ans = op1_i - op2_i;
         break;
      case '*':
         ans = op1_i * op2_i;
         break;
      case '/':
         ans = op1_i / op2_i;
         break;
      }
      st.push(to_string(ans));
    }
  }
  cout << st.top() << endl;
  return 0;
}

オペランドと演算周りは素直に書けたのですが、プログラムの終了条件を確保するために、getline をどううまく使うか?という調査で時間がかかってしまいました。あと割り算は不要だったみたいです。。