時間限制:
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
輸出【標準輸出】 對於每個表示式,輸出一行,表示對應表示式的值。
樣例輸入
312+2*3
12*(2+3)
12*(2+3)+smax(333,220+280)
樣例輸出
1860
一道簡單直觀的字串處理問題,需要用到棧,這裡我使用的是雙棧,乙個資料棧,乙個字元棧,另外需要著重注意的是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 ...