计划一个表达式(只含有加和乘法)的最大值与最小值。
其实就是一个优先级问题,写一个小小的计算器改下优先级就OK了。只要加法的优先级比乘法高那么计算出来的就是最大值,如a + b * c 那么一定是先算a + b的和再去乘c的和是最大的。因为(a + b) * c = a *c + b * c > a+ b *c (a,b,c都是正数) a,b,c是表达式也是一样的。所以要加法的优先级比乘法高就可以算最大值,同理算最小值也一样。算最小值就是写一个一般的计算器就OK了。
注意最多有12个数,而每个数最大为20,所以应该采用long long 来存。。int 存是会报错的。因为这WA了一次。。
AC代码:
#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;
int const Arsize=100;
long long number[Arsize];
int pointer_number;
char symbol[Arsize];
int pointer_symbol;
long long max_number, min_number;
char str[Arsize];
void push_number(long long num) {
number[pointer_number++] = num;
}
long long pop_number(void) {
return number[--pointer_number];
}
void push_symbol(char ch) {
symbol[pointer_symbol++] = ch;
}
char pop_symbol(void) {
return symbol[--pointer_symbol];
}
bool max_is_priority(char pre_symbol,char cnt_symbol) {
if (pre_symbol == '+') {
return true;
}
else
return false;
}
bool min_is_priority(char pre_symbol,char cnt_symbol) {
if (pre_symbol == '*') {
return true;
}
else
return false;
}
int main()
{
int test_case;
cin >> test_case;
cin.get();
while(test_case--){
pointer_symbol = 0;
pointer_number = 0;
memset(number,0,sizeof(number));
memset(symbol,0,sizeof(symbol));
max_number = 0;
min_number = 0;
cin >> str;
for (int i = 0; str[i]; i++) {
long long v = 0;
if (isdigit(str[i])) {
v = v * 10 + str[i] - '0';
i++;
while (str[i] && isdigit(str[i])) {
v = v * 10 + str[i] - '0';
i++;
}
i--;
push_number(v);
} else {
if (pointer_symbol == 0) {
push_symbol(str[i]);
} else {
char pre_symbol = symbol[pointer_symbol - 1];
char cnt_symbol = str[i];
if (max_is_priority(pre_symbol,cnt_symbol)) {
long long number_1 = pop_number();
long long number_2 = pop_number();
long long number_3 = number_1 + number_2;
push_number(number_3);
pop_symbol();
}
push_symbol(cnt_symbol);
}
}
}
while (pointer_symbol != 0) {
char cnt_symbol = pop_symbol();
long long number_1 = pop_number();
long long number_2 = pop_number();
if (cnt_symbol == '+') {
long long number_3 = number_1 + number_2;
push_number(number_3);
} else {
long long number_3 = number_1 * number_2;
push_number(number_3);
}
}
max_number = pop_number();
pointer_symbol = 0;
pointer_number = 0;
memset(number,0,sizeof(number));
memset(symbol,0,sizeof(symbol));
for (int i = 0; str[i]; i++) {
long long v = 0;
if (isdigit(str[i])) {
v = v * 10 + str[i] - '0';
i++;
while (str[i] && isdigit(str[i])) {
v = v * 10 + str[i] - '0';
i++;
}
i--;
push_number(v);
} else {
if (pointer_symbol == 0) {
push_symbol(str[i]);
} else {
char pre_symbol = symbol[pointer_symbol - 1];
char cnt_symbol = str[i];
if (min_is_priority(pre_symbol,cnt_symbol)) {
long long number_1 = pop_number();
long long number_2 = pop_number();
long long number_3 = number_1 * number_2;
push_number(number_3);
pop_symbol();
}
push_symbol(cnt_symbol);
}
}
}
while (pointer_symbol != 0) {
char cnt_symbol = pop_symbol();
long long number_1 = pop_number();
long long number_2 = pop_number();
if (cnt_symbol == '+') {
long long number_3 = number_1 + number_2;
push_number(number_3);
} else {
long long number_3 = number_1 * number_2;
push_number(number_3);
}
}
min_number = pop_number();
cout << "The maximum and minimum are " << max_number << " and " << min_number << "." << endl;
}
return 0;
}