第十一周專案二 計算表示式

2021-07-07 02:30:22 字數 2196 閱讀 1256

/*問題及**

*all right reserved.

*檔名稱:用二叉樹求解代數表示式.cpp

*完成日期;2023年11月9日

*版本號;v1.0

*問題描述:用二叉樹來表示代數表示式,樹的每乙個分支節點代表乙個運算子,每乙個葉子節點代表乙個運算數(為簡化,只支援二目運算的+、-、*、/,不加括號,運算數也只是一位的數字字元。本專案只考慮輸入合乎以上規則的情況)。

請設計演算法,(1)根據形如「1+2∗3−4/5」的字串代表的表示式,構造出對應的二叉樹(如圖),

用後序遍歷的思路計算表示式的值時,能體現出先乘除後加減的規則;

(2)對構造出的二叉樹,計算出表示式的值。

*輸入描述:代數表示式

*程式輸出:表示式對應二叉樹以及表示式的值

*/#include #include #include "btree.h"

int main()

#include #include #include "btree.h"

btnode *crtree(char s,int i,int j)

//以下為i!=j的情況

for (k=i; k<=j; k++)

if (s[k]=='+' || s[k]=='-')

if (plus==0) //沒有+或-的情況(因為若有+、-,前面必會執行plus++)

for (k=i; k<=j; k++)

if (s[k]=='*' || s[k]=='/')

//以上的處理考慮了優先將+、-放到二叉樹較高的層次上

//由於將來計算時,運用的是後序遍歷的思路

//處於較低層的乘除會優先運算

//從而體現了「先乘除後加減」的運算法則

//建立乙個分支節點,用檢測到的運算子作為節點值

if (plus!=0)

else //若沒有任何運算子,返回null

return null;

}double comp(btnode *b)

}void createbtnode(btnode *&b,char *str) //由str串建立二叉鏈}}

j++;

ch=str[j];

}}btnode *findnode(btnode *b,elemtype x) //返回data域為x的節點指標

}btnode *lchildnode(btnode *p) //返回*p節點的左孩子節點指標

btnode *rchildnode(btnode *p) //返回*p節點的右孩子節點指標

int btnodedepth(btnode *b) //求二叉樹b的深度

}void dispbtnode(btnode *b) //以括號表示法輸出二叉樹

}}void destroybtnode(btnode *&b) //銷毀二叉樹

}#define maxsize 100

typedef char elemtype;

typedef struct node

btnode;

void createbtnode(btnode *&b,char *str); //由str串建立二叉鏈

btnode *findnode(btnode *b,elemtype x); //返回data域為x的節點指標

btnode *lchildnode(btnode *p); //返回*p節點的左孩子節點指標

btnode *rchildnode(btnode *p); //返回*p節點的右孩子節點指標

int btnodedepth(btnode *b); //求二叉樹b的深度

void dispbtnode(btnode *b); //以括號表示法輸出二叉樹

void destroybtnode(btnode *&b); //銷毀二叉樹

double comp(btnode *b);

btnode *crtree(char s,int i,int j);

執行結果

知識點總結

這個程式是將運算子與數字間隔開,孩子節點是數字,雙親節點是運算子,並且將高階運算子放在下面,低階的放在上面,然後後序遍歷進行訪問,其實醬紫的話前序遍歷也照樣可以,所以說這是我覺得設計的很巧妙的乙個地方。

學習心得

遞迴無處不在。

第十一周專案二

煙台大學計算機學院 檔名稱 2.cpp 完成日期 2017年11月30日 問題描述 kruskal演算法的驗證 輸入描述 無 輸出描述 最小生成樹的構成 用到了graph.h include include include graph.h define maxsize 100 typedef str...

第十一周專案2 (2)

檔名稱 main.cpp 完成日期 2015年5月18日 版本號 v1.0 問題描述 定義乙個名為cperson的類,在此基礎上派生出cemployee類,派生類cemployee增加了兩個新的資料成員,分別用於表示部門和薪水。要求派生類cemployee的建構函式顯示呼叫基類cperson的建構函...

第十一周專案 2 1

定義乙個名為cperson的類,有以下 私有成員 姓名 身份證號 性別和年齡 成員函式 建構函式 析構函式 輸出資訊的函式。在此基礎上派生出cemployee類,派生類cemployee增加了兩個新的資料成員,分別用於表示部門和薪水。要求派生類cemployee的建構函式顯示呼叫基類cperson的...