表示式求值

2021-06-26 05:38:52 字數 1235 閱讀 8456

/*

本演算法的基本思想:把乙個表示式a看成是一小段連加或連減的式子,每小段單獨處理,

即 a=b +- b +- b...

而每乙個b項,看成是一段小連乘或除的式子,每小段單獨處理,即

b=c * / c * / c...

每個c項,看成是一段連乘方的式子,即

c=d ^ d ^ d...

而每個d呢,只有三種不同的情況:一對小括號、乙個函式、或者乙個普通實數。

用遞迴函式計算a類式子的值,就可以得到整個表示式的值了。

更快速,更容易的方法是用自動機的思想,把算式的文法寫出來,然後根據文法畫出

相應的狀態轉換圖(當然文法要滿足一定的條件,如不能有左遞迴等),程式也就出來了。

*/#define n 10000

#include #include #include #include char s[n+1];//儲存表示式的字串形式

int p;//掃瞄表示式的指標

char *lib=; //支援的函式列表,其中log(a,b)

double cala(); //計算完整表示式的值,在此宣告一下,以用於前向呼叫,到最後再實現它

double cald() //計算乙個數字、函式、或者小括號的值

else if(s[p]>='a' && s[p]<='z') //出現乙個字母,表示這應該是乙個函式,做函式處理

fun[i]='\0';

//判斷函式名,在此不做錯誤檢查

i=0;

while(strcmp(lib[i], fun)!=0)

i++;

//執行函式計算

p++; //跳過函式名之後的左括號

switch(i)

}else //普通實數,掃瞄一下就可以了

}double calc() //計算乙個乘方項的值

else

return a;

}double calb() //計算乙個乘除項的值

return a;

}double cala() //計算完整表示式的值

if(s[p]==')' || s[p]==',') //由於括號包括起來的範圍也是乙個完整的表示式

//所以要做退括號處理,','是因為對數函式log用它分開兩個引數

p++;

return a;

}int main()

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...

表示式求值

既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...

表示式求值

寫了乙個下午,各種糾結,各種問,終於搞明白了。但是自己還是想出來的一點東西的。很爽歪歪的,哈哈。先貼第一次的 include include include include include includeusing namespace std char data 7 7 int sign char ...