最簡單的表示式求值

2021-06-06 06:16:05 字數 1619 閱讀 5176

時間限制: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
999
200

** 第四屆河南省程式設計大賽

中間遇到的問題:

(1):是用棧來儲存資料,字元和數字不一樣,應開闢兩個棧:stacks1,  stacks2;因為只有三個助記符,max、min 、add 這三個中間字母不一樣,所以用它中間字母來標識就好了! 因為數字是以字元型別來儲存的,所以要把它轉換為整型用atoi() 函式。

(2) 遇到'('或者『,』不管它,讓讀取指標往後移一位,遇到')'讓棧s2出棧兩個數,讓棧s1出棧乙個助記符,根據助記符實現(取大,取小或加法)操作。

(3)因為題目要求最大的數為1000,我定義了乙個字元陣列直接就是 char ch[4],但會溢位,所以最好定義大一點,在這道題中 char  ch[5] 就可以通過。

(4)就是在main()裡定義字元陣列時,不會預設給它賦初值,所以當你乙個乙個給 char ch 賦值時,最後乙個字元後一位應給它置為ch[len]='\0'  ,要不然會出現錯誤!

我一直認為**最能表現思想。

#include

#include

#include

#include

#include

using namespace std;

int main()

if(isdigit(str[i]))

if(str[i]==')')

if(c=='i')

if(c=='d')

}i++;

}int res=s2.top();

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

}return 0;}

簡單表示式求值

char evaluateexpression else c getchar gettop optr,e else gettop opnd,e return e 核心演算法如圖所示,基本思想是利用棧的基本性質和操作 數棧和算符棧兩棧分開 結合算符優先順序順序的二維陣列定義,完成基本算數表示式的核心演...

簡單表示式求值(只有 )

題目如下 輸入僅有一行,為需要你計算的表示式,表示式中只包含數字 加法運算子 和乘法運算子 且沒有括號,所有參與運算的數字均為 0 到 2 31 1 之間的整數。輸入資料保證這一行只有 0 9 這 12 種字元。輸出格式 輸出只有一行,包含乙個整數,表示這個表示式的值。注意 當答案長度多於 4 位時...

簡單算術表示式求值

題目 利用cin,getline將輸入分成前半部分和後半部分,便於操作 例如 32 3 分成數字部分 32字串部分 3 include using namespace std intmain re num n break else if s i re n num break else if s i ...