演算法實現中綴轉為字尾表示式
首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1(含乙個結束符號),乙個作為輸入逆波蘭式的棧s2(空棧),s1棧可先放入優先順序最低的運算子#,注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非#不可。從中綴式的左端開始取字元,逐序進行如下步驟:計算機如何計算字尾表示式?(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入s2棧
(2)若取出的字元是運算子,則將該運算子與s1棧棧頂元素比較,如果該運算子優先順序(不包括括號運算子)大於s1棧棧頂運算子優先順序,則將該運算子進s1棧,否則,將s1棧的棧頂運算子彈出,送入s2棧中,直至s1棧棧頂運算子低於(不包括等於)該運算子優先順序,最後將該運算子送入s1棧。
(3)若取出的字元是「(」,則直接送入s1棧頂。
(4)若取出的字元是「)」,則將距離s1棧棧頂最近的「(」之間的運算子,逐個出棧,依次送入s2棧,此時拋棄「(」。
(5)重複上面的1~4步,直至處理完所有的輸入字元
(6)若取出的字元是「#」,則將s1棧內所有運算子(不包括「#」),逐個出棧,依次送入s2棧。
完成以上步驟,s2棧便為逆波蘭式輸出結果。不過s2應做一下逆序處理。便可以按照逆波蘭式的計算方法計算了!
下面以(a+b)c為例子進行說明:(a+b)c的逆波蘭式為ab+c,假設計算機把ab+c按從左到右的順序壓入棧中,並且按照遇到運算子就把棧頂兩個元素出棧,執行運算,得到的結果再入棧的原則來進行處理,那麼ab+c的執行結果如下:
1)a入棧(0位置)
2)b入棧(1位置)
3)遇到運算子「+」,將a和b出棧,執行a+b的操作,得到結果d=a+b,再將d入棧(0位置)
4)c入棧(1位置)
5)遇到運算子「」,將d和c出棧,執行d*c的操作,得到結果e,再將e入棧(0位置)
經過以上運算,計算機就可以得到(a+b)*c的運算結果e了。
逆波蘭式除了可以實現上述型別的運算,它還可以派生出許多新的演算法,資料結構,這就需要靈活運用了。逆波蘭式只是一種序列體現形式。
題目描述
讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
輸出對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
樣例輸入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92樣例輸出0
12178.21其實下面的**去掉空格是錯的,正確的如下: (因為刪掉前面的位置,位置會變,但是i會出錯)
for(int i=s.length()-1;i>=0;i–)
#include
using
namespace std;
struct node
; string str;
stack s;
//操作符棧
queue q;
//字尾表示式序列
map<
char
,int
> op;
//優先順序定義
void
change()
q.push
(temp);}
else
temp.op = str[i]
; s.
push
(temp)
; i++;}
}//for迴圈結束後,操作符棧還有乙個操作符,彈到字尾表示式中
while
(!s.
empty()
)}double
cal()}
return s.
top(
).num;
//棧頂元素就是字尾表示式的值
}int
main()
while
(!s.
empty()
) s.
pop();
//初始化棧
change()
;//將中綴表示式轉為字尾表示式
printf
("%.2f\n"
,cal()
);//計算字尾表示式
}return0;
}
位運算實現加減乘除四則運算
只用邏輯運算實現加法 int add int a,int b int sumtemp a b int carry a b 1 return add 只用邏輯運算實現減法 int minus int a,int b 邏輯運算實現除法 低效 int div int a,int b return resu...
位運算實現加減乘除四則運算
目錄加法 減法 乘法 除法計算機最基本的操作單元是位元組 byte 乙個位元組由8個位 bit 組成,乙個位只能儲存乙個0或1,其實也就是高低電平。無論多麼複雜的邏輯 龐大的資料 酷炫的介面,最終體現在計算機最底層都只是對0101的儲存和運算。不考慮進製情況下,位的異或運算跟求 和 的結果一致 異或...
位運算實現加減乘除四則運算
目錄 加法減法 乘法除法 計算機最基本的操作單元是位元組 byte 乙個位元組由8個位 bit 組成,乙個位只能儲存乙個0或1,其實也就是高低電平。無論多麼複雜的邏輯 龐大的資料 酷炫的介面,最終體現在計算機最底層都只是對0101的儲存和運算。不考慮進製情況下,位的異或運算跟求 和 的結果一致 異或...