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