圖1 四則運算展示
測試**如下
1在網上找了很多四則運算帖子,講的都挺不錯,思路很清晰,可是很少有拿來直接能用的,並且大多數的都不支援負數運算,既然是四則運算當然需要支援負數運算了,在這裡我們只需要使用一點兒小技巧即可。void
lineedit::calculateexpression()
2
1、針對負號進行字串修復 例如:-1*-3+2*(3+3) -> (0-1)*(0-3)+2*(3+3)。
12、為了方便後續我們計算表示式,在中綴表示式轉字尾表示式時,我們在數字和負號之間加了乙個空格。//針對負號進行字串修復 例如:-1*-3+2*(3+3) -> (0-1)*(0-3)+2*(3+3)
2void repairexpress(qstring &express)318
19if (c == '
-'&&
20 (i == 0 || lpos != -1 && lpos == i - 1
))21
2526 lpos =i;27}
282930}
3132 express =result;
33 }
1中綴表示式:是乙個通用的算術或邏輯公式表示方法, 操作符是以中綴形式處於運算元的中間(例:3 + 4),中綴表示式是人們常用的算術表示方法。//數字和負號之間插入空格, 方便後續計算時分割
2void rettifyexpress(qstring &express)
38 }
字尾表示式:字尾表示式,指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則)。
中綴表示式轉字尾表示式的方法:
1.遇到運算元:直接輸出(新增到字尾表示式中)
2.棧為空時,遇到運算子,直接入棧
3.遇到左括號:將其入棧
4.遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。
5.遇到其他運算子:加減乘除:彈出所有優先順序大於或者等於該運算子的棧頂元素,然後將該運算子入棧
6.最終將棧中的元素依次出棧,輸出。
下邊我直接給出實現**
1view code//中綴表示式轉字尾表示式
2 qstring change(const qstring &s_mid)322
if (c == '
-' &&
23 (i == 0 || op.contains(s_mid[i-1])))//
可能為負號
2427
if(op.contains(c))//
判斷該元素是否為運算子
2837
stk.pop();38}
39else
if(stk.empty() || c == '
(' || op[c] > op[stk.top()])//
情況1、情況3
4043
else
if(op[c] <= op[stk.top()])//
情況344
52stk.push(c);53}
5455
rettifyexpress(result);56}
57else
5861}62
63while(stk.empty() == false)//
當中綴表示式輸出完成,所有元素出棧
6469
70return
result;
71 }
通過字尾表示式計算時,我們就不需要考慮優先順序了,只需要嚴格按照從左向右,遇到負號取之前的兩個數值進行計算即可。
1qt之加減乘除四則運算-支援負數//計算表示式值
2double calexp(const qstringlist &express)325
26stk.push_back(qstring::number(result));27}
28else
2932}33
34return
result;
35 }
位運算實現加減乘除四則運算
只用邏輯運算實現加法 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的儲存和運算。不考慮進製情況下,位的異或運算跟求 和 的結果一致 異或...