/*
本演算法的基本思想:把乙個表示式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 ...