表示式的前中字尾表示和表示式運算

2021-07-08 12:59:30 字數 2275 閱讀 7550

一、將自然表示式轉換為前/中/字尾表示式,首先按照自然表示式中運算元和操作符的優先順序順序構造出表示式對應的二叉樹,然後對二叉樹進行前序/中序/後序遍歷,即得到前/中/字尾表     達式

二、一些其他的遍歷原則:

1、深度優先遍歷:

2、廣度優先遍歷:

首先訪問出發頂點v,然後訪問與頂點v鄰接的全部未被訪問過的頂點w0,w1,...wk-1;接著再依次訪問與頂點w0,w1,...wk-1鄰接的全部未被訪問過的頂點,以此類推,直至圖的所有頂點都被訪問到,或出發頂點v所在的連通分量的全部頂點都被訪問到為止。

注:對於樹來說,深度優先就是從左到右,從上到下;廣度優先就是從上到下,從左到右。

三、中綴表示式轉字尾表示式(棧的應用)

中綴表示式「9+(3-1)*3+10/2」轉化為字尾表示式為「9 3 1- 3 * + 10 2 / +」.

規則:從左到右遍歷中綴表示式的每一數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧 頂符號的優先順序,是右括號或優先順序低於棧頂符號(乘除優先加減)則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。

a.初始化一空棧,用來對符號進出棧使用。

b.第乙個字元是數字9,輸出9,後面是符號「+」,進棧。

c.第三個字元是「(」,依然是符號,因其只是左括號,還沒有配對,故進棧。

d.第四個字元是數字3,輸出,總表示式為9 3,接著是「-」,進棧。

e.接下來是數字1,輸出,總表示式為9 3 1,後面是符號「)」,此時,我們需要去匹配此前的「(」,所以棧頂依次出棧,並輸出,直到「(」出棧為止。此時左括號上方只有「-」,因此輸出「-」。總的表示式為9 3 1 -。

f.接著是數字3,輸出,總的表示式為9 3 1 - 3.緊接著是符號「*」,因為此時的棧頂符號為「+」號,優先順序低於「*」,因此不輸出,「*」進棧。

g.之後是符號「+」,此時當前棧頂元素「*」比這個「+」的優先順序高,因此棧中元素出棧並輸出(沒有比「+」更低的優先順序,所以全部出棧),總輸出表示式為9 3 1 - 3 * +。然後將當前這個符號「+」進棧。

h.緊接著數字10,輸出,總表示式為9 3 1 - 3 * + 10。後是符號「/」,所以「/」進棧。

i.最後乙個數字2,輸出,總的表示式為9 3 1 - 3 * + 10 2。

j.因已經到最後,所以將棧中符號全部出棧並輸出。最終輸出的字尾表示式結果為9 3 1 - 3 * + 10 2 / +。

四、字尾表示式計算結果(棧的應用)

字尾表示式為:9 3 1 - 3 * + 10 2 / +

規則為:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。

a.初始化乙個空棧。此棧用來對要運算的數字進行進出使用。

b.字尾表示式中前三個是、都是數字,所以9 3 1 進棧。

c.接下來是「-」,所以將棧中的1出棧作為減數,3出棧作為被減數,並運算3-1得到2,再講2進棧。

d.接著是數字3進棧。

e.後面是「*」,也就意味著棧中3和2出棧,2與3相乘,得到6,並將6進棧。

f.下面是「+」,所以棧中6和9出棧,9和6相加,得到15,將15進棧。

g.接著是10和2兩數字進棧。

h.接下來是符號「/」,因此,棧頂的2與10出棧,10與2相除,得到5,將5進棧。

i.最後乙個是符號「+」,所以15與5出棧並相加,得到20,講20進棧。

j.結果是20出棧,棧變為空。

簡單的實現**:

#include#include#includeusing namespace std;

stackst1;

stackst2;

int main()

}else

st1.push(str1[i]);}}

else}}

}} if (st1.size() != 0)

} cout << str2 << endl;

//由字尾表示式計算結果

int temp1, temp2, te***;

len2 = str2.length();

for (i = 0; i < len2; i++)

else

else if (str2[i] == '-')

else if (str2[i] == '*')

else if (str2[i] == '/')

st2.push(te***);

}} cout << st2.top() << endl;

}}

前,中,字尾表示式

字首表示式,中綴表示式,字尾表示式都是四則運算的表達方式,用以四則運算表示式求值,即數學表示式的求值。比如乙個簡單的數學表示式 1 2 3 4 這是我們常見的數學表示式型別 即中綴表示式 為什麼要將簡單的中綴表示式轉化為複雜的波蘭式或逆波蘭式 原因在於,簡單的中綴表示式在用人的思維邏輯來看,確實簡單...

前 中 字尾表示式

1 字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前 2 舉例說明 3 4 5 6 對應的字首表示式就是 3 4 5 6 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧 重複上述過程直到表示式最左...

表示式的字尾表示

include includeusing namespace std const int stackincreament 20 溢位時的擴容 templateclass seqstack void push const t x bool pop t x bool top t x bool isemp...