新聞中心
前面我們已經(jīng)關(guān)于計(jì)算器介紹的已經(jīng)夠多了,那么它現(xiàn)在還是沒有具備計(jì)算的功能。
今天我們來繼續(xù)講解計(jì)算器的解析算法,那么對(duì)于一個(gè)四則運(yùn)算表達(dá)式,
它是如何讀懂的呢?比如:“+9.11 + ( -3 - 1 ) * -5 ”;
人類習(xí)慣的數(shù)學(xué)表達(dá)式叫做中綴表達(dá)式,還有一種將運(yùn)算符放在數(shù)字后面的后綴表達(dá)式,
比如:5 + 3 ==> 5 3 +; 1 + 2 * 3 ==> 1 2 3 * +;像這種就是后綴表達(dá)式。
那么中綴表達(dá)式是符合人類的閱讀和思維習(xí)慣,后綴表達(dá)式則符合計(jì)算機(jī)的運(yùn)算方式,
這是一種消除了中綴表達(dá)式中的括號(hào),同時(shí)保留中綴表達(dá)式中的運(yùn)算優(yōu)先級(jí)。
解決方案就是:
1、將中綴表達(dá)式進(jìn)行數(shù)字和運(yùn)算符的分離
2、將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式
3、通過后綴表達(dá)式計(jì)算最終結(jié)果
所要計(jì)算的中綴表達(dá)式中包含
1、數(shù)字和小數(shù)點(diǎn)【0 - 9 或 . 】
2、符號(hào)位【 + 或 - 】
3、運(yùn)算符【+,-,/, * 】
4、括號(hào)【 (或)】
具體的思想就是以符號(hào)作為標(biāo)志對(duì)表達(dá)式中的字符逐個(gè)訪問
1、定義累計(jì)變量 num
2、當(dāng)前字符 exp[i] 為數(shù)字或小數(shù)點(diǎn)時(shí):
累計(jì):num += exp[i];
3、當(dāng)前字符 exp[i] 為符號(hào)時(shí):
num 為運(yùn)算數(shù),分離并保存;
若 exp[i] 為正負(fù)號(hào):
累計(jì)符號(hào)位 + 和 - : num += exp[i];
若 exp[i] 為運(yùn)算符:
分離并保存;
用偽代碼描述出來就是這樣:
我們接下來分析下這個(gè)分離算法的難點(diǎn)在哪?當(dāng)然是如何區(qū)分正負(fù)號(hào)與加號(hào)和減號(hào)。我們可以這樣想:正+ 和 負(fù)- 在表達(dá)式的第一個(gè)位置;括號(hào)后的 正+ 和 負(fù)- ;運(yùn)算符后的 正+ 和 負(fù)-;
具體代碼則為:
QQueue
{
QQueue
QString num = "";
QString pre = "";
for(int i=0; i
}
我們?cè)跇?gòu)造函數(shù)里設(shè)置如下:
那么我們構(gòu)建運(yùn)行完得到的結(jié)果如下:
那么我們可以看到計(jì)算器正確的識(shí)別了四則表達(dá)式,今天我們就先學(xué)習(xí)到這了。后面我們接著繼續(xù)計(jì)算器的解析算法的學(xué)習(xí)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前名稱:QT之計(jì)算器對(duì)四則運(yùn)算表達(dá)式的解析(九)-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://biofuelwatch.net/article/cdgops.html