• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語・スタックを使用した逆ポーランド記法について)

C言語・スタックを使用した逆ポーランド記法について

このQ&Aのポイント
  • C言語でスタック(リスト構造)を使用した逆ポーランド記法のプログラムを作りたいのですが、どのようにして数字と演算子を区別すればいいのでしょうか?
  • 質問者はC言語でスタックを使用した逆ポーランド記法のプログラムを作成したいと考えています。具体的には、計算式(例:1234+*+)が入力されたとき、数字と演算子をどのように区別するかを知りたいとしています。
  • プログラムの一部として、スタック構造の定義や操作のコードが提示されています。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.4

つい2週間くらい前に逆ポーランドの処理コードを書きました。 言語はObjective-Cでしたけど。 記憶に新しいので助言します。 まず、逆ポーランドの処理では、数値も演算子もトークン(呼び方は一例)として 扱います。 C言語でしたら、トークンを構造体で表現するのが自然かと思います。 typedef enum {   TOKEN_TYPE_NUM,   TOKEN_TYPE_OPERAND } token_type; typedef struct {   token_type type;   int value; // 数値または演算子 } token; そうすると、トークンは1234+*+の7つあるわけですから、tokenポインタが7つPushされた スタックを作ります。 あとはルールに従ってPopとPushで処理していけばいいですよね。 > どのようにして数字と演算子を区別すればいいのでしょうか? もうお分かりかと思いますが、一例を書きます。 token *t; StackPop(s, &t); if(t->type == TOKEN_TYPE_NUM){   // t->valueを数値として処理 } if(t->type == TOKEN_TYPE_OPERAND){   // (char)t->valueを演算子として処理 } 最後に、ほかの方も指摘していますが、質問者様のコードはツリー型のスタックになっていません。 というか、スタック実装は通常リンクリストであってツリーにはしないです。 ツリーを使う処理として、二分探索木なんかが教科書にはよく登場します。 http://ja.wikipedia.org/wiki/2%E5%88%86%E6%8E%A2%E7%B4%A2%E6%9C%A8 スタックでは、通常ノードとノードがポインタで連結した構造をとります。 具体的にはこんなコードになるはずです。 http://www.freecprograms.com/lilink.htm 勉強用であればそのままでもいいかもしれませんが、とりあえずポインタのPush/Popが できるように改造しないとjjk65536案は使えないですね。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.5

No.4です。 ツリーなんてどこにも書いてないですね。 大変失礼しました。 お恥ずかしい。

すると、全ての回答が全文表示されます。
  • LOHA
  • ベストアンサー率52% (203/388)
回答No.3

>どのようにして数字と演算子を区別すればいいのでしょうか? 入力が文字列であると仮定した場合ですが、一文字目から順に見ていって、普通にswitchかifで比較・処理するのではダメなのでしょうか? たとえば、 char* input = "1234+*+"; ならforつかって if (input[i] >= '0' && input[i] <= '9') { 数値の処理 } else if (input[i] == '*') { 掛け算の処理 } (以下略) あるいは switch (input[i]) {  case '0': case'1': ... case'9': 数値の処理  case '*': 掛け算の処理  (以下略) } という感じで比べられます。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>スタック(リスト構造)を使用した と書いてありますが、構造体が自己参照型になってませんね。 リスト構造を使ったことになってないんじゃないですか?

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その例の「1234+*+」は何を意味するのですか?

すると、全ての回答が全文表示されます。
MG3630本体のみで簡単初期化方法
このQ&Aのポイント
  • MG3630を使っていて、接続していたパソコンなしで本体のみで初期化する方法についての質問です。
  • キヤノンMG3630の本体だけを使用して初期化するためには、特定の手順が必要です。
  • 問題解決のために、MG3630の本体をリセットする方法を明確に理解することが重要です。
回答を見る

専門家に質問してみよう