C言語でスタック(リスト構造)を使用した逆ポーランド記法のプログラムを作りたいのですが
計算式(例:1234+*+)が入力された場合、どのようにして数字と演算子を区別すればいいのでしょうか?
一応スタック構造の部分は、
#include <stdio.h>
#include <stdlib.h>
/*スタック構造*/
typedef struct stack
{
int max;
int ptr;
int *stk;
} Stack;
/*スタックの確保・初期化*/
int StackAlloc(Stack *s, int max)
{
s->ptr = 0;
if ((s->stk = calloc(max, sizeof(int))) == NULL)
{
s->max = 0;
return (-1);
}
s->max = max;
return (0);
}
/*スタック解放*/
void StackFree(Stack *s)
{
if (s->stk != NULL)
{
free(s->stk);
s->max = s->ptr = 0;
}
}
/*プッシュ*/
int StackPush(Stack *s, int x)
{
if (s->ptr >= s->max)
return (-1);
s->stk[s->ptr++] = x;
return (0);
}
/*ポップ*/
int StackPop(Stack *s, int *x)
{
if (s->ptr <= 0)
return (-1);
*x = s->stk[--s->ptr];
return (0);
}
/*データのピーク*/
int StackPeek(const Stack *s, int *x)
{
if (s->ptr <= 0)
return (-1);
*x = s->stk[s->ptr - 1];
return (0);
}
/*スタックの大きさを返却*/
int StackSize(const Stack *s)
{
return (s->max);
}
/*データを返却*/
int StackNo(const Stack *s)
{
return (s->ptr);
}
/*スタックは空か*/
int StackEmpty(const Stack *s)
{
return (s->ptr <= 0);
}
/*スタックは満杯か*/
int StackFull(const Stack *s)
{
return (s->ptr >= s->max);
}
/*スタックを空にする*/
void StackClear(Stack *s)
{
s->ptr = 0;
}
といった感じで仕上げています。
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 …
スタックでは、通常ノードとノードがポインタで連結した構造をとります。
具体的にはこんなコードになるはずです。
http://www.freecprograms.com/lilink.htm
勉強用であればそのままでもいいかもしれませんが、とりあえずポインタのPush/Popが
できるように改造しないとjjk65536案は使えないですね。
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 '*': 掛け算の処理
(以下略)
}
という感じで比べられます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングc++を全く分か...
-
あってる
-
gccを行ってもexeファイルが生...
-
C++でデスクトップGUIアプリ開...
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
-
Windows Formアプリからコンソ...
-
Cの関数の引数のconst *charに...
-
Cのプログラムからアクセスでき...
-
C言語について。
-
0 == False はいいけど
-
ArduinoのジャイロモジュールMP...
-
MACで動く実行ファイルをWindow...
-
大量のデータを読み込んで表示...
-
チャットGPT 4について質問があ...
-
C# で 数式文字列処理を処理す...
-
C言語のことです。写真(見にく...
-
プログラミング言語でアプリや...
-
c++の勉強方法を教えてくださ...
-
パソコン
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
エラー?メッセージ
-
最大スタックサイズを大きくす...
-
スタックフレームの消滅
-
gccでスタックサイズを変更する...
-
_CRTIMPの意味は?
-
リストを使った逆ポーランド記...
-
CASLとCASL2の違いについて
-
Ethernetヘッダの取得 NDIS
-
関数のプロローグとエピローグ...
-
二分探索木の行きがけ順走査
-
マス目上の移動のアルゴリズム
-
C言語・スタックを使用した逆...
-
printf / sprintf のスタック消...
-
スタックとキュー
-
スタック領域変更
-
Visual C++ 2008 オーバーフロ...
-
スタックの伸張方向
-
再帰関数を使うとき、ソフトウ...
-
スタックのpush/pop動作について
おすすめ情報