A - Stack

cpaojalds1

最終更新日

問題

https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/3/ALDS1_3_A (新しいタブで開く)

問題文

逆ポーランド記法で与えられた数式の計算結果を出力してね。

制約

サンプル

I/O 1

1 2 +
3

I/O 2

1 2 + 3 4 - *
-3

考察

stack に積んでいって、演算子が出てきたら pop して計算して push するだけ。

コード

https://onlinejudge.u-aizu.ac.jp/status/users/a01sa01to/submissions/1/ALDS1_3_A/judge/6312150/C++17 (新しいタブで開く)

int main() {
  string s;
  getline(cin, s);

  int n = s.size();
  queue<string> q;
  {
    string tmp = "";
    rep(i, n) {
      if (s[i] == ' ') {
        q.push(tmp);
        tmp = "";
      }
      else
        tmp.push_back(s[i]);
    }
    q.push(tmp);
  }
  stack<double> st;
  while (!q.empty()) {
    string tmp = q.front();
    q.pop();
    if (tmp == "+" || tmp == "-" || tmp == "*") {
      double b = st.top();
      st.pop();
      double a = st.top();
      st.pop();
      if (tmp == "+") st.push(a + b);
      else if (tmp == "-")
        st.push(a - b);
      else if (tmp == "*")
        st.push(a * b);
    }
    else
      st.push(stoi(tmp));
  }
  cout << st.top() << endl;
  return 0;
}