第九屆省賽題 表示式求值

2021-07-31 02:41:34 字數 1567 閱讀 1624

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

假設表示式定義為: 1. 乙個十進位制的正整數 x 是乙個表示式。 2. 如果 x 和 y 是 表示式,則 x+y, x*y 也是表示式; *優先順序高於+. 3. 如果 x 和 y 是 表示式,則 函式 smax(x,y)也是表示式,其值為:先分別求出 x ,y 值的各位數字之和,再從中選最大數。 4.如果 x 是 表示式,則 (x)也是表示式。 例如: 表示式 12*(2+3)+smax(333,220+280) 的值為 69。 請你程式設計,對給定的表示式,輸出其值。  

輸入【標準輸入】 第一行: t 表示要計算的表示式個數 (1≤ t ≤ 10) 接下來有 t 行, 每行是乙個字串,表示待求的表示式,長度<=1000

輸出【標準輸出】 對於每個表示式,輸出一行,表示對應表示式的值。

樣例輸入

3

12+2*3

12*(2+3)

12*(2+3)+smax(333,220+280)

樣例輸出

18

60

一道簡單直觀的字串處理問題,需要用到棧,這裡我使用的是雙棧,乙個資料棧,乙個字元棧,另外需要著重注意的是smax函式,這個函式是smax(a,b)的形式,所以我們忽略掉smax四個字元,直接處理檢索到的「(」「,」「)」,也就是說將這個函式中的括號和其他括號統一規則處理,而將逗號和加號、乘號劃為一類來處理。注意優先順序問題即可。

#include#include#include#include#includeusing namespace std;

char ch[1010];

int chang,a,b;

stackshu; //用來儲存數的棧

stackfu; //用來儲存符號的棧

int smax(int x,int y) //計算出smax中的最大值

while(y)

return sumx>sumy?sumx:sumy;

}int getnum(int *k) //算出數的值

(*k)--;

// printf("%d %d****\n",*k,num);

return num;

}int main()

shu.push(num);

fu.pop();

}fu.pop();

}else if(ch[i]==','||ch[i]=='+'&&!fu.empty()&&fu.top()=='*')

shu.push(num);

fu.pop();

}fu.push(ch[i]);

}else if(ch[i]=='+'||ch[i]=='*'||ch[i]==','||ch[i]=='(')

}while(!fu.empty())

shu.push(num);

fu.pop();

}int s=shu.top();

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

}return 0;

}

表示式求值 第九屆河南省賽

時間限制 1 sec 記憶體限制 64 mb 提交 17 解決 14 提交 狀態 討論版 假設表示式定義為 1.乙個十進位制的正整數 x 是乙個表示式。2.如果 x 和 y 是 表示式,則 x y,x y 也是表示式 優先順序高於 3.如果 x 和 y 是 表示式,則 函式 smax x,y 也是表...

第九屆河南省賽 表示式求值 四則運算表示式

假設表示式定義為 1.乙個十進位制的正整數 x 是乙個表示式。2.如果 x 和 y 是 表示式,則 x y,x y 也是表示式 優先順序高於 3.如果 x 和 y 是 表示式,則 函式 smax x,y 也是表示式,其值為 先分別求出 x y 值的各位數字之和,再從中選最大數。4 如果 x 是 表示...

第九屆河南省大學生程式設計大賽 A題 表示式求值

問題描述 假設表示式定義為 1.乙個十進位制的正整數 x 是乙個表示式。2.如果 x 和 y 是 表示式,則 x y,x y 也是表示式 優先順序高於 3.如果 x 和 y 是 表示式,則 函式 smax x,y 也是表示式,其值為 先分別求出 x y值的各位數字之和,再從中選最大數。4 如果 x ...