通常人在書寫的時候習慣是書寫中綴表示式也叫逆波蘭式,然而在計算機處理的時候中綴表示式的效率遠小於字尾表示式,即運算元在前面,運算子在後面例如:
中綴表示式 a+b 字尾表示式ab+
a+b*c abc*+
a*b+c*d ab*cd*+
d+a/(b_c) dabc-/+
字尾表示式計算時,所有運算按照運算子出現的順序,嚴格從左到右,每個操作符取前兩個運算元進行運算,運算後的結果仍然作為下次的運算元,這樣做與中綴表示式完全等價,即計算次序和運算結果完全相同,並且不再使用括號,逆波蘭式的主要特點在於運算物件(運算元)不變,運算符號反應運算順序,採用逆波蘭式很好的表達簡單運算子,其優點在於已與計算機處理表示式,因此算術表示式計算問題進行分解,先將中綴轉換為字尾表示式在進行計算。
這個過程一共分為兩步,第一步,把輸入的表示式轉換為字尾表示式,第二步,計算字尾表示式
轉化字尾表示式的過程:
1.當讀到運算元後存入陣列中,
2.當讀到運算子的時候,把優先順序比這個運算子小或者等於的所有運算子出棧,再把這個運算子入棧
3.當讀左括號的時候,入棧
4.當讀到右括號得時候,將靠近棧頂的左括號之前的所有運算子出棧,存入陣列中然後再將左括號出棧
計算字尾表示式的過程:
對於計算字尾表示式而言,只是按照自然地從左到右的邏輯順序,當遇到運算元的時候就入棧,當遇到運算子的時候,就取棧頂的前兩個元素進行操作,然後操作完的數,再入棧,然後繼續掃瞄,一直直到表示式遍歷完,
實現演算法如下:
#include#include#include#include #include #include#define maxn 1000
using namespace std;
stacks; //定義了乙個棧
char *tranfexp(char* exp)
else if(exp[i] == '(' ) //如果是左括號及入棧
else if(exp[i] == ')' ) //如果是右括號就把接近棧頂的左括號上面所有的運算子出棧存進字串中 左括號出棧
else}}
else if(exp[i] == '+' || exp[i] == '-') //如果的事+-|操作符就把比他優先順序高或者等於的所有運算子出棧進入字串
else
break;
}s.push(exp[i]);
}else if(exp[i] == '*' || exp[i] == '/') //類似於掃瞄到+- 只是如果棧中有=-運算子就不用出棧 因為運算子優先順序比較小
else
break;
}s.push(exp[i]);
}i++;
}while(s.empty() == false) //把棧中剩餘的所有運算子出棧
tempstr[j] = 0; //最後乙個賦值為0 也就是字串結束的標誌
return tempstr; //返回已經得到的字尾表示式
}int calcexp(char* exp)// 計算字尾表示式
資料結構《中綴表示式轉字尾表示式的實現》
主要功能 利用棧將中綴表示式轉換成字尾表示式 並對字尾表示式求值。include include include using namespace std define maxsize 50 typedef char elemtype typedef struct sqstack typedef st...
資料結構 中綴表示式轉字尾表示式
話不多說上例子 1 2 3 4 5 1 2 3 4 5 中綴表示式轉字尾表示式思路分析 1.首先需要兩個棧運算子棧 s1和儲存中間結果的棧 s2 2.從左至右掃瞄中綴表示式 2.1當前為運算元,將其壓棧至s2 2.2當前為運算子 2.2.1如果s1為空或者棧頂運算子為左括號 則將此運算子直接入s1棧...
資料結構之中綴表示式轉字尾表示式
中綴表示式轉字尾表示式的基本規則 1.遇到運算元就直接輸出 2.遇到左括號就壓入棧中 3.遇到右括號就將棧中所有符號輸出且彈出 左括號只需要彈出不需要輸出 4.遇到操作符就與棧頂元素進行對比 當前操作符比棧頂操作符的優先順序大的話 就直接將當前操作符壓入棧中 當前操作符比棧頂操作符的優先順序小或者相...