字首表示式,中綴表示式,字尾表示式都是四則運算的表達方式,用以四則運算表示式求值,即數學表示式的求值。
比如乙個簡單的數學表示式 (1+2)-(3+4) 這是我們常見的數學表示式型別 即中綴表示式
為什麼要將簡單的中綴表示式轉化為複雜的波蘭式或逆波蘭式
原因在於,簡單的中綴表示式在用人的思維邏輯來看,確實簡單,但在計算機看來中序表示式是非常複雜的結構,而相對而言,(逆)波蘭式在計算機看來是非常簡單的結構,因為計算機普遍採用的記憶體結構是棧式結構,而(逆)波蘭表示式在其儲存和計算上也採用的是棧的特性。
使用時,對於波蘭式和逆波蘭式,使用時可隨便選擇一種,這兩者在本質上沒有區別,只是表達形式不同而已,下面就逆波蘭式來講解如何計算表示式值及其與中綴表示式的轉換的程式實現。
中綴表示式與字尾表示式的轉換
1.建立乙個棧,乙個佇列2.從左至右順序遍歷中綴表示式。
3.遇到運算元時,直接壓入佇列
4.遇到運算子時:
當遇到左括號或是棧為空,直接壓棧
當遇到右括號時,依次彈棧,直至棧頂是左括號,彈棧結束!期間所有的操作符按順序入隊
當遇到操作符時,若棧頂是左括號,則直接入棧
若棧頂是操作符,則比較兩操作符優先順序,若當前字元優先順序較高,則壓棧,若當前字
符優先順序小於等於棧頂運算子,則將棧頂運算子彈出併入隊,繼續與當前棧頂元素比較!
直到當前運算子優先順序高於棧頂運算子則入棧,或是遇到左括號或是棧為空,亦入棧!
5.遍歷完所有字元後,彈出棧中仍剩有的操作符,併入隊
6.依次出隊即可達到相應的字尾表示式!
vector
mid2last(string str)
else
//遇到空格則繼續遍歷
if(str[i]==' ')
continue;
//作括號直接入棧
else
if(str[i]=='(')
s.push("(");
else
if(str[i]==')')
}else
if(str[i]=='+')}}
else
if(str[i]=='-')}}
}}
if(start!=-1)
while(!s.empty())
vector
res;
while(!q.empty())
return res;
}
字尾表示式值的計算
1.建立乙個棧2.從左到右順序遍歷字尾表示式
3.遇到運算元則直接進棧
4.遇到操作符,則依次彈出棧頂上的兩個元素,對其進行運算,然後將運算結果進棧
5.重複 2,3,直至遍歷完整個表示式,那麼棧中將只剩下乙個元素,它就是整個表示式的運算結果
int evalrpn(vector
& tokens)
else
}return helper.top();
}
字首表示式在操作上與字尾表示式的幾個不同點 前 中 字尾表示式
1 字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前 2 舉例說明 3 4 5 6 對應的字首表示式就是 3 4 5 6 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧 重複上述過程直到表示式最左...
前 中 字尾表示式的轉換
前 中 字尾表示式的轉換 自然表示式轉換為前 中 字尾表示式,其實是很簡單的。首先將自然表示式按照優先順序順序,構造出與表示式相對應的二叉樹,然後對二叉樹進行前 中 字尾遍歷,即得到前 中 字尾表示式。舉例說明將自然表示式轉換成二叉樹 a b c d 根據表示式的優先順序順序,首先計算 b c 形成...
表示式的前中字尾表示和表示式運算
一 將自然表示式轉換為前 中 字尾表示式,首先按照自然表示式中運算元和操作符的優先順序順序構造出表示式對應的二叉樹,然後對二叉樹進行前序 中序 後序遍歷,即得到前 中 字尾表 達式 二 一些其他的遍歷原則 1 深度優先遍歷 2 廣度優先遍歷 首先訪問出發頂點v,然後訪問與頂點v鄰接的全部未被訪問過的...