- ベストアンサー
C言語・スタックを使用した逆ポーランド記法について
- C言語でスタック(リスト構造)を使用した逆ポーランド記法のプログラムを作りたいのですが、どのようにして数字と演算子を区別すればいいのでしょうか?
- 質問者はC言語でスタックを使用した逆ポーランド記法のプログラムを作成したいと考えています。具体的には、計算式(例:1234+*+)が入力されたとき、数字と演算子をどのように区別するかを知りたいとしています。
- プログラムの一部として、スタック構造の定義や操作のコードが提示されています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
つい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.4です。 ツリーなんてどこにも書いてないですね。 大変失礼しました。 お恥ずかしい。
- LOHA
- ベストアンサー率52% (203/388)
>どのようにして数字と演算子を区別すればいいのでしょうか? 入力が文字列であると仮定した場合ですが、一文字目から順に見ていって、普通に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)
>スタック(リスト構造)を使用した と書いてありますが、構造体が自己参照型になってませんね。 リスト構造を使ったことになってないんじゃないですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
その例の「1234+*+」は何を意味するのですか?