中綴表示式樹及其結果計算

2021-07-29 14:20:40 字數 1530 閱讀 4800

題目

給定一棵二叉樹,二叉樹的各個結點要麼表示四則運算符+、-、*、/,要麼表示乙個不超過10的非負整數。將這棵二叉樹看作中綴表示式樹,輸出對應的中綴表示式,以及該中綴表示式的計算結果。

注意,輸出的中綴表示式中,除了最外層以外,內層的每個「左運算元 操作符 右運算元」形式的兩側都要加上一對小括號。例如2+(3*(4/5))就是乙個可能的正確輸出。

輸入每個輸入檔案中一組資料。

第一行乙個正整數n(n<=30),代表二叉樹的結點個數(結點編號為0到n-1)。

第二行按結點編號從小到大的順序給出n個結點的值(用空格隔開),其要麼是四則運算符+、-、*、/的其中乙個,要麼是乙個不超過10的非負整數。

接下來按結點編號從小到大的順序給出n行,每行為兩個編號,分別代表該結點的左孩子編號和右孩子編號,如果不存在左(右)孩子,那麼就用字元'-'代替。資料保證編號在0到n-1之間,且中綴表示式樹一定是合法的。

輸出輸出一行,即所求的中綴表示式與對應的計算結果(精度保留兩位小數),表示式與計算結果之間用空格隔開。注意輸出的中綴表示式中不允許有空格。資料保證中綴表示式合法,且計算過程中不會出現除數為0的情況。

輸入樣例5

* 3 + 4 6

1 2- -

3 4- -

- -

輸出樣例

3*(4+6) 30.00 標程

#include#include#include#includeusing namespace std;

const int max = 30;

struct nodenode[max];

int n;

bool isroot[max];

void create()

string str;

for (int i = 0; i < n; i++)

else

else

} cin >> str;

if (str == "-")

else

else

} }}int findroot()

}void inorder(int root)

else

}double cal(int root)

else if (node[root].data == "+")return cal(node[root].lchild) + cal(node[root].rchild); //用左子樹的結果和右子樹結果計算

else if (node[root].data == "-")return cal(node[root].lchild) - cal(node[root].rchild);

else if (node[root].data == "*")return cal(node[root].lchild) * cal(node[root].rchild);

else if (node[root].data == "/")return cal(node[root].lchild) / cal(node[root].rchild);

}int main()

中綴表示式轉字尾表示式及其計算

演算法 1.迴圈讀取輸入的字串 2.讀取到運算元 輸出 3.讀取到 彈出棧的內容到輸出流直到遇到 最後將 或 入棧 4.讀取到 彈出棧的內容到輸出流直到遇到 最後將 或 入棧 5.讀取到 入棧 6.讀取到 彈出棧的內容到輸出流直到遇到 圓括號不輸出。個人實現的 如下 public static st...

計算中綴表示式

計算中綴表示式 可以稱得上是乙個特別經典的關於棧的演算法題,幾乎在所有資料結構教材中都會涉及,而且很多公司面試或者筆試的時候都會把這道題作為乙個考察點。可以說,這是一道必須要掌握的演算法題。中綴表示式 字尾表示式等概念在這裡就不贅述了,讓我們直奔主題。題目 輸入乙個中綴表示式,計算其結果。輸入的前提...

中綴表示式計算

雙棧法 數字棧和運算子棧 1.從前向後遇見數字就壓入數字棧 2.遇見左括號壓棧 3.遇見右括號則彈出數字棧頂兩個數字,和乙個運算子棧乙個運算子進行計算,直至遇見左括號,退括號,計算結果壓棧 4.遇見運算子,若符號棧頂的元素小於當前運算子優先順序,則入棧 若相等或大於則數字彈出倆,符號彈出乙個計算,直...