給定一串計算表示式
例如 (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棧可先放入優先順序最低的運算子 注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非 不可。從中綴式的左端開始取字元,逐...