以下の図式を2分木にしようと思っているのですが、
こつとかありましたら教えてください。
私は、以下のように造ればいいかなと思いますが、
イメージがはっきりしません。
(1+2)*3+(4+(5+6)*3)*2+1
->
Node1=(1+2)
Node1*3+(4+(5+6)*3)*2+1
Node2=Node1*3
Node2+(4+(5+6)*3)*2+1
Node3=(5+6)
Node2+(4+Node3*3)*2+1
・・・
です。
しかし、こんな方法で上手く作れるのかわかりません。
これだと、単純に左から右に演算子の優先順位を見て
/*がスタックにあると+-はおいておいて/*を先に出す。
)があれば、前の(まで演算子をスタックから取り出していくという方法のほうがよい気がします。
(1+2)*3+(4+(5+6)*3)*2+1
↓
................|-----+---------|...
................|...............|...
........|-------+---------|.....1...
........|.................|.........
..|-----*---|......|------*------|..
..|.........|......|.............|..
|-+-|.......3..|---+---|.........2..
|...|..........|.......|............
1...2..........4...|---*---|........
...................|.......|........
...............|---+---|...3........
...............|.......|............
...............5.......6............
(メモ帳でこぴぺしてください。)
12+3*456+3*+2*+1+
No.2ベストアンサー
- 回答日時:
普通の、中置記法から逆ポーランド記法への、変換法が載っているページがいくつかあると思うので、
見てみるとよいと思うのですが、LALR1文法と思ってスタックを使って変換すると、実はカッコの処理もたいして大変ではなかったりします。
頭いい方法ですね。
この回答への補足
とりあえずできました。
ノードの情報を増やしました。括弧に対応するためです。
struct NODE
{
NODE *Parent;
NODE *Left;
NODE *Right;
NODE *xArrayNext;
NODE *xArrayPrev;
char Code;
int Priority;
int StringCount;//usedebug
};
括弧なしの四則演算は簡単でした。
xArrayNext、xArrayPrevは、
((1+2*3)*(5-4))
内の一文字をそれぞれ順番に格納していき、
ある一文字の次のノード、前のノードです。
一番深い括弧の中のノードをまずツリー化して、
得られたトップノードのxArrayNext、xArrayPrevを括弧の前後にくっつけて、Priorityを(と同じにする。
そして、再計算(繰り返し、)しました。
ありがとうございました。
一応できたつもりでしたが、
重大な論理エラーがありました。
括弧の内部をツリー化して、その外枠の演算子とノード化するときに、
その大内の括弧は数値のように振舞わないといけないことが解りました。
ご報告いたします。
このプログラムは、現在修正中です。
No.1
- 回答日時:
仰るとおり、普通はスタック(+1文字先読み)を使って処理します。
「逆ポーランド記法 変換 スタック」
とかで検索すれば、大量に情報が出てくるかと。
他の方法でもがんばれば出来るかもしれませんが、スタックを使う処理より早くできるとは思えません。
この回答への補足
ありがとうございました。
今は、とりあえず、
struct NODE
{
NODE *Left;
NODE *Right;
NODE *Parent;
char Code;
int Cnt;
};
という構造体を式の長さの数だけ作成して、
Codeのところに、「1」「2」「+」「*」などを順番に格納しています。
肝心なのは、+-*/演算子なのでそれを連結していき、
あまったところへ、数値文字を連結していくというやり方で作成中です。()についてはまだ考慮に入れていません。
前途多難ですが、何とかやってみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- 工学 永久機関を磁石で作れませんか?ずっと引き寄せる力があると思うのですが何かに利用できないのでしょうか? 2 2022/06/19 08:23
- その他(自然科学) 永久機関を磁石で作れませんか?ずっと引き寄せる力があると思うのですが何かに利用できないのでしょうか? 3 2022/06/22 10:57
- その他(アウトドア) アマチュア無線の近所の公園運用50W出力(3級です)をアマゾン通販でさがしています、(12V)出力、 1 2022/04/29 06:49
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Android(アンドロイド) Team microSDXCカード 256GB この製品は有名で性能は良いものでしょうか 5 2022/09/24 23:25
- オープンソース Vue+Laravelのデザインテンプレートのサンプルが起動できない 1 2022/05/18 21:52
- タブレット 第10世代 Fire HD 8 △(左向き)、〇、□のマークが表示されない 2 2022/12/18 17:02
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー?メッセージ
-
スタック領域変更
-
スタックとキューの使い所
-
最大スタックサイズを大きくす...
-
CASLとCASL2の違いについて
-
基本情報技術者のデータ構造あ...
-
パソコンでインターネット接続...
-
ubuntuで デイスク/deb/loopと...
-
hdmiはパラレル?シリアル?
-
ライン数とステップ数の違いに...
-
命令口調について
-
ルータの負荷対策でL2スイッチ...
-
Macと iPadの違いについて 今現...
-
Ic-PcAn はどこのこと?
-
TCPではなく、UDPが音声や動画...
-
トランザクションとは何のこと...
-
プログラムの規模を表す単位「k...
-
L2スイッチの管理VLANに...
-
ステップ数について
-
Native VLANの変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.netでDLLを読み込んで実行す...
-
最大スタックサイズを大きくす...
-
エラー?メッセージ
-
Ethernetヘッダの取得 NDIS
-
GCCで関数の引数が渡らない
-
printf / sprintf のスタック消...
-
スタックフレームの消滅
-
H8マイコン スタック領域に...
-
pthreadのスタックサイズ設定取...
-
_CRTIMPの意味は?
-
スタックを用いて整数配列を入...
-
再帰処理を非再帰処理に書き換...
-
VC++でプログラムから現在のス...
-
cloneのスタック管理
-
マス目上の移動のアルゴリズム
-
gccでスタックサイズを変更する...
-
OCXからのコールバックを繰り返...
-
コンパイラオプション
-
VC++6.0 Stack Overflow !!
-
スタック領域変更
おすすめ情報