最終更新:2026-10-12
C++ スタック型電卓の設計¶
スタック電卓を 1 つ書きます。設計は次のとおりです:
+、-、*、/演算のサポート- 後置記法入力のサポート
例えば:
出力: どのように実装すればよいのでしょうか?中でも最も重要な 2 つの問題:
1.トークン分割をどのように行うか
2.スタックをどのように実装するか
1.トークン分割の方法¶
まず、入力は文字列で、スペース区切りであると定義しておけば、istringstream で各 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 を返すだけです。
とても簡単でしょう。ぜひ私と一緒に議論しましょう。
関連トピック¶
- C++ FnOnce を手書きする | C++那些事
- C++ gRPC ミニプロジェクト | C++那些事
- C++ プロセス間通信実践 | C++那些事
- C++ 短縮URLサービス Demo | C++那些事
- C++17 と SQLite でディレクトリサイズを集計 | C++那些事
- Google Benchmark 性能テスト | C++那些事
- C++20 コルーチン HTTP サーバ | C++那些事
- Protobuf ZeroCopy シリアライズ | C++那些事
- pybind11 で Python を高速化 | C++那些事