コンテンツにスキップ

最終更新:2026-10-12

C++ スタック型電卓の設計

スタック電卓を 1 つ書きます。設計は次のとおりです:

  • +、-、*、/ 演算のサポート
  • 後置記法入力のサポート

例えば:

2 3 +
出力:
5
どのように実装すればよいのでしょうか?

中でも最も重要な 2 つの問題:

1.トークン分割をどのように行うか

2.スタックをどのように実装するか

1.トークン分割の方法

まず、入力は文字列で、スペース区切りであると定義しておけば、istringstream で各 token を分割できます。基本のフレームワークは次のとおりです:

std::istringstream iss(expression);
std::string token;
while (iss >> token) {
}

2.スタックの実装方法

電卓にとって最も核心となるのが、プッシュとポップです。

  • 数字に遭遇したらプッシュ
  • 演算子に遭遇したらポップして計算

これでフレームワークを書けます:

if (isNumber(token)) {
  pushNumber(token);
} else if (isOperator(token)) {
  popAndCal(token);
} else {
  throw std::runtime_error("Invalid token in expression.");
}

popAndCal が計算の核心です。例えば:

void popAndCal(const std::string& token) {
  if (operandStack.size() < 2) {
    throw std::runtime_error("Invalid expression.");
  } else {
    double operand2 = operandStack.top();
    operandStack.pop();
    double operand1 = operandStack.top();
    operandStack.pop();
    double result = performOperation(operand1, operand2, token);
    operandStack.push(result);
  }
}

こうしてスタックの中に欲しい結果が格納されるので、最後に top を返すだけです。

とても簡単でしょう。ぜひ私と一緒に議論しましょう。

関連トピック

コメント