• ベストアンサー
※ 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+*+」は何を意味するのですか?

関連するQ&A

専門家に質問してみよう