說(shuō)到表達(dá)式求值問題,相信很多人都是迷?;蛘卟恢涝撊绾蜗率秩ソ鉀Q問題。首先要知道什么是表達(dá)式求值?可以解決什么問題?
通過看了表達(dá)式求值的一系列題目得知,要解決的問題一般是輸入一個(gè)字符串表示的表達(dá)式,要求輸出它的值。當(dāng)然也有變種比如表達(dá)式中是否包含括號(hào),指數(shù)運(yùn)算,含多少變量,判斷多個(gè)表達(dá)式是否等價(jià),等等。
表達(dá)式一般需要先進(jìn)行語(yǔ)法分析再求值,也可以邊分析邊求值,語(yǔ)法分析的作用是檢查輸入的字符串是否是一個(gè)合法的表達(dá)式,一般使用語(yǔ)法分析器解決。
表達(dá)式包含兩類字符:運(yùn)算數(shù)和運(yùn)算符。對(duì)于長(zhǎng)度為n的表達(dá)式,借助合適的分析方法,可以在O(n)的時(shí)間復(fù)雜度內(nèi)完成分析與求值。
說(shuō)到表達(dá)式求值的問題,表達(dá)式求值的順序一部分是由操作符的優(yōu)先級(jí)和結(jié)合性決定。
同樣,有些表達(dá)式的操作數(shù)在求值的過程中可能需要轉(zhuǎn)換為其他類型。
(1)常用表達(dá)式求值分析
①方法
常見的方法有兩種,一種是中綴表達(dá)式求值,一種是后綴表達(dá)式求值
②優(yōu)缺點(diǎn)
中綴表達(dá)式:符合人的習(xí)慣,但是在計(jì)算機(jī)中計(jì)算時(shí)要考慮其優(yōu)先級(jí)和括號(hào)的關(guān)系,實(shí)現(xiàn)起來(lái)比較麻煩
后綴表達(dá)式:在計(jì)算機(jī)中實(shí)現(xiàn)時(shí)不需要考慮優(yōu)先級(jí)和括號(hào),因?yàn)楹缶Y表達(dá)式已經(jīng)將其解決了,但是不符合人的習(xí)慣
(2)相互轉(zhuǎn)換分析
①關(guān)于前綴的轉(zhuǎn)換是從右向左掃描的
②關(guān)于后綴的轉(zhuǎn)換是從左向右轉(zhuǎn)換的
3.總結(jié)
不管是怎么樣轉(zhuǎn)換和怎么樣計(jì)算,思路理解起來(lái)都沒那么難,難就難在代碼的實(shí)現(xiàn)上,這個(gè)還是需要大家做大量的題,去通過實(shí)踐來(lái)理解。
當(dāng)你代碼有了、思路有了,用代碼敲出自己的思路,記?。?span style="text-indent: 2em;">代碼的實(shí)踐很重要!
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程