UVA10700

计划一个表达式(只含有加和乘法)的最大值与最小值。

其实就是一个优先级问题,写一个小小的计算器改下优先级就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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值