C 二叉樹表示式計算

2022-08-26 09:21:09 字數 2641 閱讀 1579

很早以前就寫過雙棧的表示式計算.

這次因為想深入學一下二叉樹,網上都是些老掉牙的關於二叉樹的基本操作.

感覺如果就學那些概念,沒意思也不好記憶.於是動手寫了乙個表示式計算的應用例子.

這樣學習印象才深嘛.

我喜歡逆過來貼**~

這是執行結果:

cal() 是節點類裡的計算方法,從根節點呼叫,遞迴所有子節點進行計算.left,right分別是左右子節點.

1

public

double

cal()27

return

value;

8 }

下面的cal(大寫)的是靜態的計算方法,根據不同符號進行不同計算.

1

public

static

double cal(int fuhao, double l, doubler)2

14return0;

15 }

看到這,是不是覺得很簡單呢?

沒錯,二叉樹在計算表示式時非常簡單,但難點在於如何構建這個表示式樹.

寫程式最重要的就是嚴謹強大的邏輯思維能力.

在寫下面的方法時,我經歷了很多次debug.大概修改了10次,才完成..可見我的邏輯能力還是很不足.

下面這個方法包含大量邏輯判斷,可能不好理解,也許某些判斷可以簡化優化,而且我預設第一位是數字,也就是不支援第一位是括號的表示式.

1

public

static bnode createtree(listzf)2;

4var kh = new list ;

5 bnode curn=null

;6 bnode tempcur = null;7

foreach (var a in

zf)8

;21 tp.right =curn;

22 t.parent =curn;23}

24else

if (curn.parent.fuhaovalue >=tfhvalue)

25//

新加的符號優先順序不高於當前節點的父節點符號,

2636

if (tp.parent == null)37

;39 tp.parent =curn;40}

41else42;

45 p.right =curn;

46 tp.parent =curn;47}

48}49}

50else51;

54 t.parent =curn;55}

5657}58

else

if(kh.contains(a))

59

65else

if (a == ")"

)6673}

74else

75 ;

78else

if (curn.isdig == false)79

;82 t.right =curn;83}

84}85}

8687

return

curn;

88 }

其實寫起來也沒什麼太大難度,只要把所有情況的處理都考慮到就行.

最後是2個輔助函式.

fenge:我比較偷懶,事先把字串裡的數字和符號分隔開了,這樣就不用一位一位的去取判斷是數字或者符號.

cal:使用時唯一需要接觸的函式.

1

public

static

double cal(string

expresstion)210

11public

static

string fenge(string

exp)12"

};14 ys.foreach(a =>

15);

19return

exp;

20 }

1

public

bnode gettop()

2

總結:二叉樹計算的優勢在於易於擴充套件,很容易將數字計算擴充套件成支援函式,引數的表示式計算.

計算時候的邏輯很簡單,但是構建二叉樹就比較複雜.

基本邏輯:遇到數字,放到左節點,遇到符號(判斷是否為根節點,是作為數字的父節點,否的話判斷符號優先順序,優先順序高,就放入低優先順序的右節點;優先順序低或者等於就

放到前乙個符號的父節點.

括號的處理就是:重新創乙個節點作為當前節點,當作乙個新的表示式進行處理,等遇到右括號的時候,再將括號內的表示式的根節點放入之前最後處理的節點的子節點.

邏輯很多比較複雜,慢慢想應該不難理解.

效率來說:純數字的計算肯定二棧的方式快.

二叉樹計算中綴表示式

看到 資料結構 思想與實現 這本書裡5.3的程式 給出的程式是有問題的 敲到vs中,發現右閉括號不能起到作用,例如 輸入 3 5 7,輸出則是38,右閉括號沒有起到作用。自己調了很久,終於修改對了,下面是正確的 include using namespace std class calc struc...

二叉樹表示式計算(2)

學號 2014329620069 姓名 張卓鵬 班級 14計科2 define crt secure no warnings include include include include include include include include using namespace std typ...

棧 二叉樹 表示式 表示式樹 表示式求值

總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入 輸入...