Problem 67: 表达式
Description
给你一个只有+和*的无括号表达式,给这个表达式加上任意括号,求出这个表达式的最大值和最小值
Input
先是n(n < 10000)表示测试数据组数
接下n行每一行一个表达式,表达式中不会超过100个数,每个数大于等于1小于等于20,测试数据结果不超过longlong类型
Output
按下列事例输出每一行的最大值和最小值
Sample Input
3
1+2*3*4+5
4*18+14+7*10
3+11+4*1*13*12*8+3*3+8
Sample Output
The maximum and minimum are 81 and 30.
The maximum and minimum are 1560 and 156.
Description
给你一个只有+和*的无括号表达式,给这个表达式加上任意括号,求出这个表达式的最大值和最小值
Input
先是n(n < 10000)表示测试数据组数
接下n行每一行一个表达式,表达式中不会超过100个数,每个数大于等于1小于等于20,测试数据结果不超过longlong类型
Output
按下列事例输出每一行的最大值和最小值
Sample Input
3
1+2*3*4+5
4*18+14+7*10
3+11+4*1*13*12*8+3*3+8
Sample Output
The maximum and minimum are 81 and 30.
The maximum and minimum are 1560 and 156.
The maximum and minimum are 339768 and 5023.
那么剩下的就是栈的操作了,找最小值时,把乘号两边的运算数都乘成为“一个”加号的运算数,最后把留在栈里的元素加起来即为最小值;找最大值时,把加号两边的运算数都加成为“一个”乘号的运算数,最后把留在栈里的元素乘起来即为最大值。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stack>
using namespace std;
int main(){
int n, len, i;
long long Max, Min, a, temp;
char str[505];
stack <long long> s;
scanf("%d", &n);
while(n--){
memset(str, 0, sizeof(str));
scanf("%s", str);
len = strlen(str);
i = 0; temp = 0;//第一个肯定是数字,找全后入栈
while(str[i] >= '0' && str[i] <= '9'){
temp = temp * 10 + (str[i] - '0');
i++;
}
s.push(temp);
while(i < len){//计算最大值
if(str[i] == '+'){//若是加号,把两个运算数加起来,变成乘法里的一个运算数
i++;
temp = 0;
while(str[i] >= '0' && str[i] <= '9'){
temp = temp * 10 + (str[i] - '0');
i++;
}
a = s.top();
s.pop();
a += temp;
s.push(a);
}
else{
i++;
temp = 0;
while(str[i] >= '0' && str[i] <= '9'){
temp = temp * 10 + (str[i] - '0');
i++;
}
s.push(temp);
}
}
Max = 1;
while(!s.empty()){
temp = s.top();
s.pop();
Max *= temp;
}
i = 0; temp = 0;
while(str[i] >= '0' && str[i] <= '9'){
temp = temp * 10 + (str[i] - '0');
i++;
}
s.push(temp);
while(i < len){
if(str[i] == '*'){
i++;
temp = 0;
while(str[i] >= '0' && str[i] <= '9'){
temp = temp * 10 + (str[i] - '0');
i++;
}
a = s.top();
s.pop();
a *= temp;
s.push(a);
}
else{
i++;
temp = 0;
while(str[i] >= '0' && str[i] <= '9'){
temp = temp * 10 + (str[i] - '0');
i++;
}
s.push(temp);
}
}
Min = 0;
while(!s.empty()){
temp = s.top();
s.pop();
Min += temp;
}
printf("The maximum and minimum are %lld and %lld.\n", Max, Min);
}
return 0;
}