題目
給定一棵二叉樹,二叉樹的各個結點要麼表示四則運算符+、-、*、/,要麼表示乙個不超過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.遇見運算子,若符號棧頂的元素小於當前運算子優先順序,則入棧 若相等或大於則數字彈出倆,符號彈出乙個計算,直...