總時間限制: 1000ms
記憶體限制: 65535kb
【描述】
眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a+b*c,可以表示為如下的表示式樹:
+/ \
a *
/ \b c
現在,給你乙個中綴表示式,這個中綴表示式用變數來表示(不含數字),請你將這個中綴表示式用表示式二叉樹的形式輸出出來。
【輸入】
輸入分為三個部分。
第一部分為一行,即中綴表示式(長度不大於50)。中綴表示式可能含有小寫字母代表變數(a-z),也可能含有運算子(+、-、*、/、小括號),不含有數字,也不含有空格。
第二部分為乙個整數n(n < 10),表示中綴表示式的變數數。
第三部分有n行,每行格式為c x,c為變數的字元,x為該變數的值。
【輸出】
輸出分為三個部分,第乙個部分為該表示式的逆波蘭式,即該表示式樹的後根遍歷結果。佔一行。
第二部分為表示式樹的顯示,如樣例輸出所示。如果該二叉樹是一棵滿二叉樹,則最底部的葉子結點,分別佔據橫座標的第1、3、5、7……個位置(最左邊的座標是1),然後它們的父結點的橫座標,在兩個子結點的中間。如果不是滿二叉樹,則沒有結點的地方,用空格填充(但請略去所有的行末空格)。每一行父結點與子結點中隔開一行,用斜槓(/)與反斜槓(\)來表示樹的關係。/出現的橫座標位置為父結點的橫座標偏左一格,\出現的橫座標位置為父結點的橫座標偏右一格。也就是說,如果樹高為m,則輸出就有2m-1行。
第三部分為乙個整數,表示將值代入變數之後,該中綴表示式的值。需要注意的一點是,除法代表整除運算,即捨棄小數點後的部分。同時,測試資料保證不會出現除以0的現象。
【樣例輸入】
a+b*c
3a 2
b 7c 5
【樣例輸出】
abc*+
+/ \
a *
/ \b c
37
【**】
#include #include #include #include #include #include using namespace std;
mappriority = , , , , };
mapvalue;
struct node_t
};stackop;
stackexpression;
inline void doit()
node_t *build_tree(char *in)
else
else }}
while (!op.empty())
return expression.top();
}void postfix_dfs(node_t *cur)
int cal(int a, int b, char o)
int cal_tree(node_t* cur)
int tree_height(node_t *cur)
void print_tree(node_t *rt)
; int tree_h = tree_height(rt);
vector*v1 = new vector(), *v2 = new vector();
v1->push_back();
for (int h = tree_h; h >= 1; --h) );
v2->push_back();}}
putchar('\n');
if (h == 1)
break;
/* print branch */
last_pos = 0;
for (node nd : *v1)
putchar('\n');
/* get ready for next loop */
v1->clear();
swap(v1, v2);
}}int main()
cout << cal_tree(rt) << endl;
system("pause");
return 0;
}
【分析】
借用「直接求中綴表示式」的思想,也可以有中綴表示式直接構建表示式樹
不同的地方在於,直接求中綴表示式時,我們把棧頂兩個數的運算結果放回棧中,這次我們把棧頂兩個節點拼成的新節點放回棧中
由於資料規模太大,陣列開不下,不能用dfs遞迴列印;改為使用bfs列印
用last_pos標記的方法列印中間的空格是個好方法
層次bfs的方法:佇列不用queue結構而用vector結構,節點資訊中不用儲存深度資訊;用兩個vector指標,一輪迴圈結束時swap是方便的寫法
表示式求值 表示式轉二叉樹
1 後序表示式求值 後續表示式 逆波蘭式 的特點 沒有括號。求值方法 從前向後掃,遇到運算元壓棧 遇到操作符,從棧中取出2個運算元運算,結果壓棧。最終棧中所剩的數為結果。2 中序表示式求值 我們先來定義運算子的優先順序 從上到下依次公升高 準備2個棧,乙個專門存放運算子,另乙個專門存放運算元。1.遇...
表示式 表示式樹 表示式求值
總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入輸入分...
先綴表示式構建表示式二叉樹
在表示式二叉樹的學習中,有很多有趣的構造其表示式二叉樹的方法,其中先綴表示式構建表示式二叉樹常見有很多都是利用遞迴的方式去構建,但在閱覽的一篇文件中,引出了非遞迴方式構建其表示式二叉樹概念,雖然相對更麻煩,但在其 實現,探索上還是很有意義的.c語言實現 先綴表示式 23 45 如圖,如果從左到右讀取...