表示式樹建立與計算(中綴表示式轉逆波蘭式)

2021-10-25 11:48:50 字數 1919 閱讀 3472

給定一串計算表示式

例如 (1+2*4-2)*3+4 * (2+4)/2

計算此表示式的值,並輸出此表示式樹的前序中序後序序列。

首先,給定的表示式為正常邏輯的中綴表示式,我們需要將其轉化為逆波蘭式(字尾表示式),如下給出理由

例如 a*b-c

它的二叉樹如下

前序序列為:- * a b c

中序序列為: a * b - c

後序序列為: a b * c -

對於前序序列,運算順序應該為首先對離運算子最近的ab操作,ab前有乘號,將ab相乘,代替ab的位置,然後此時離運算子最近的為ab的結果與c,前方的操作符為-號則進行a*b-c操作。而此種運算順序實際上不利於**模擬。

相反,對於後序序列,則可以用棧輕鬆模擬,首先建立乙個運算元棧,從左到右遍歷。

因此我們想要計算表示式,可以先將其轉化成逆波蘭式(字尾表示式),就可以計算出值,而對於如何從中綴表示式轉成字尾表示式,思路如下:

首先建立乙個運算子棧,從左到右遍歷,利用vector儲存答案

vector中即為字尾表示式。

對於正確性,可以自己寫幾個例子簡單模擬一下。

解決了從中綴轉字尾,就可以算出值,而對於通過字尾表示式建立二叉樹,思路與字尾表示式計算一樣。

思路如下:(從左到右遍歷字尾表示式)

首先建立乙個指標棧

結束後棧中剩下的指標即為此二叉樹的根結點指標。

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int n=

100010

;typedef

struct node

node,

*root;

string str,str1;

vectorres;

int ans=0;

intfun2

(string a)

//運算子優先順序判斷

bool

cmp(string a,string b)

void

fun1()

//中綴表示式轉字尾表示式

else}if

(p.size()

)v.push_back

(p);

stacks;

for(

int i=

0;isize()

;i++)}

else

s.push

(v[i]);

}}}}

}while

(s.size()

)//for(int i=0;i}

root build()

//二叉樹建立

else

}return s.

top();

}intjs(

)//計算表示式的值

s.push

(tt)

;//cout

else

}return s.

top();

}void

pre(root roo)

//前序遍歷

}void

mid(root roo)

//中序遍歷

}void

back

(root roo)

//後序遍歷

}int

main

(void

)

中綴表示式轉字尾表示式與計算

1.建立兩個棧,乙個儲存數字和字尾表示式s1,乙個儲存符號棧s2 2.儲存流程 1 如果符號棧s2為空,直接存入符號。2 如果不為空,當前符號優先順序等於或者大於棧的符號,直接存入。3 如果不為空,當前符號優先順序雄小於棧的符號,先彈出乙個符號棧頂的元素,再比較,然後再存入 4 如果遇到 直接存入。...

中綴表示式轉字尾表示式

using system using system.collections.generic using system.text namespace 中綴表示式轉字尾表示式 class convert public void run top break case case while top 1 st...

中綴表示式轉字尾表示式

將乙個普通的中綴表示式轉換為字尾表示式的一般演算法是 首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1 含乙個結束符號 乙個作為輸入字尾表示式的棧s2 空棧 s1棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...