四則運算 簡單計數器(有加減乘除,沒有括號)

2021-10-03 18:32:40 字數 2316 閱讀 3008

演算法實現中綴轉為字尾表示式

首先需要分配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的儲存和運算。不考慮進製情況下,位的異或運算跟求 和 的結果一致 異或...