表示式求值

2021-07-03 23:07:05 字數 1779 閱讀 9902

時間限制:3000 ms  |  記憶體限制:65535 kb

難度:3

描述 dr.kong設計的機械人卡多掌握了加減法運算以後,最近又學會了一些簡單的函式求值,比如,它知道函式min(20,23)的值是20 ,add(10,98) 的值是108等等。經過訓練,dr.kong設計的機械人卡多甚至會計算一種巢狀的更複雜的表示式。

假設表示式可以簡單定義為:

1. 乙個正的十進位制數 x 是乙個表示式。

2. 如果 x 和 y 是 表示式,則 函式min(x,y )也是表示式,其值為x,y 中的最小數。

3. 如果 x 和 y 是 表示式,則 函式max(x,y )也是表示式,其值為x,y 中的最大數。

4.如果 x 和 y 是 表示式,則 函式add(x,y )也是表示式,其值為x,y 之和。

例如, 表示式 max(add(1,2),7) 的值為 7。

請你編寫程式,對於給定的一組表示式,幫助 dr.kong 算出正確答案,以便校對卡多計算的正誤。

輸入

第一行: n 表示要計算的表示式個數 (1≤ n ≤ 10) 

接下來有n行, 每行是乙個字串,表示待求值的表示式

(表示式中不會有多餘的空格,每行不超過300個字元,表示式中出現的十進位制數都不

超過1000。)

輸出輸出有n行,每一行對應乙個表示式的值。

樣例輸入

3

add(1,2)

max(1,999)

add(min(1,1000),add(100,99))

樣例輸出

3

999200

題目分析:這道題是典型的用棧來解決的問題、、

源**如下:

**一:

用陣列來模擬棧來運算

#include

#include

int add(int a,int b);//定義三個運算函式來進行三種運算

int max(int a,int b);

int min(int a,int b);

int main()

else if(s[i]==','||s[i]==')')//迴圈進行,碰到「,」或」)「壓入資料

n=0;//讓n歸零以便下一組資料的計算。

}else if(s[i]!=')')

if(s[i]==')')//碰到右括號表示乙個表示式壓入完畢,開始計算。

case 'n':

case 'x':}}

}if(flag==1)

else

}return 0;

}int add(int a,int b)

int max(int a,int b)

else

}int min(int a,int b)

else

}**二:

用c++的棧容器來計算

#include

#include

#include

#define m 301

using namespace std;

stacksata;

stackdata;

int main()

else if(s[i]==','||s[i]==')')//逗號不會被壓進棧。

}else if(s[i]!=')')

c=k;//倘若輸入進去的是乙個單數字,則輸出這個單數字。

if(s[i]==')')} }

printf("%d\n",c);

}return 0;}

表示式求值

程式的說明見清華大學出版社 資料結構 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 ...