表示式的三種形式:
字尾表示式:不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則,如:2 1 + 3 *
字首表示式:同字尾表示式一樣,不包含括號,運算子放在兩個運算物件的前面,如:* + 2 1 3,注意 / 2 1 對應的 中綴表示式是 2 / 1 而不是 1 / 2。
由於字首表示式不常用
這裡就給大家講解一下如何用棧來實現中綴表示式向字尾表示式的轉換。
演算法步驟:
假設我們欲將中綴表示式
a + b * c + ( d * e + f ) * g
轉換成字尾表示式 。正確的答案是
a b c * + d e * f + g * +
演算法總的來說可以分為4步:
①當讀到字母時,我們直接輸出,當讀到運算子時,我們將運算子推入棧。(當是空棧的時候)這裡給出對應中綴表示式轉字尾表示式的原始碼,輸入字元,以 # 結束。②當讀到右括號」)「,我們就將棧中的元素彈出並輸出,直到我們遇到對應的左括號,但是這個左括號只被彈出,並不輸出。
③當棧中有元素的時候,如果我們又遇到了運算子,那麼我們從棧中彈出元素並輸出, 直到我們發現優先順序更低的元素為止。 這裡有乙個例外,除非遇到 右括號「)」,否則我們絕不將 左括 號」(「彈出。
對於這個操作, 」 +「 」 - 「 的優先順序最低, 」 x 「 」 / 「其次, 」(「的優先順序最高 。 當我們從棧中彈出元素的任務完成的時候,我們再將遇到的運算子壓入棧中。
④最後,如果我們讀到輸入的末尾,我們將棧中的元素依次彈出直到變為空棧,並依次輸出棧中的元素。
#include#include#include#include#include#includeusing namespace std;typedef char elementtype;
const int init_size = 100;
struct stack
void push(int x)
else
st.push(ch); //推入當前運算子
}else
st.pop(); //刪除左括號
}else
st.push(ch);}}
} }print(); //列印棧中剩餘的運算子
return 0;
}
計算字尾表示式
由於字尾表示式沒有括號,而且並不需要知道任何優先規則,所以計算機處理起來比較方便,而且可以實現線性效率的運算 時間花費為o(n),這裡繼續用棧來實現字尾表示式的求值。
a b c * + d e * f + g * +
a + b * c + ( d * e + f ) * g
這個演算法非常簡單:
和中綴表示式轉字尾表示式正好相反。 遇到字母我們推入棧中, 遇到運算子, 我們就把棧中最上面兩個元素彈出來,進行運算,再將運算結果再推入棧中。
注意如果運算子是/我們要用第二個彈出的數 除以 第乙個彈出的數。
最後的結果就是棧中剩餘的最後乙個元素。
#include#include#include#include#include#include#includeusing namespace std;
const int maxn = 110;
stackst;
int main()
if(isdigit(ch))
else{
int a = st.top();
st.pop();
int b = st.top();
st.pop();
int ans;
if(ch == '+')
ans = b + a;
else if(ch == '-')
ans = b - a;
else if(ch == '*')
ans = b * a;
else if(ch == '/')
ans = b / a;
// cout<
資料結構學習 中綴表示式轉字尾表示式
本題所描繪的中綴轉字尾,只是很簡單的轉。並不能達到寫計算器的目的,本文在此只用於個人的基礎鞏固,以及淺層次的思考,幫助進行中綴表示式轉字尾表示式的理解。中綴表示式如1 2 2 1 其運算子一般出現在運算元之間,因此稱為中綴表示式,也就是大家程式設計中寫的表示式。編譯系統不考慮表示式的優先級別,只是對...
資料結構學習 中綴表示式轉字尾表示式(c )
表示式的三種形式 字尾表示式 不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則,如 2 1 3 字首表示式 同字尾表示式一樣,不包含括號,運算子放在兩個運算物件的前面,如 2 1 3,注意 2 1 對應的 中綴表示式是 2 1 而不是...
資料結構 中綴表示式轉字尾表示式
話不多說上例子 1 2 3 4 5 1 2 3 4 5 中綴表示式轉字尾表示式思路分析 1.首先需要兩個棧運算子棧 s1和儲存中間結果的棧 s2 2.從左至右掃瞄中綴表示式 2.1當前為運算元,將其壓棧至s2 2.2當前為運算子 2.2.1如果s1為空或者棧頂運算子為左括號 則將此運算子直接入s1棧...