LeetCode-227. Basic Calculator II (JAVA)实现计算器 II

227. Basic Calculator II

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

Note: Do not use the eval built-in library function.

设计一个计算器,输入有效,并且只含有+, -, *, /,空格,全是非负整数

使用栈,栈内存的是所有的中间结果,最后把站内数据加起来,就是最终结果

// 支持"-1 * 5"但不支持"-1 * +5"
public int calculate(String s) {
	int len;
	if (s == null || (len = s.length()) == 0)
		return 0;
	Stack<Integer> stack = new Stack<Integer>();
	int num = 0;
	// sign记录本次数字之前的上一个运算符,初始值为'+',
	char sign = '+';
	for (int i = 0; i < len; i++) {
		if (Character.isDigit(s.charAt(i))) {
			num = num * 10 + s.charAt(i) - '0';
		}
		// 先乘除后加减
		if ((!Character.isDigit(s.charAt(i))
				// 非空格
				&& ' ' != s.charAt(i))
				// 到达字符串结束处,需要计算最后一次结果
				|| i == len - 1) {
			// 加减不计算结果,直接压入栈,运算符优先级
			if (sign == '-') {
				stack.push(-num);
			}
			if (sign == '+') {
				stack.push(num);
			}
			// 乘除从栈中弹出一个数字计算结果,在压入栈
			if (sign == '*') {
				stack.push(stack.pop() * num);
			}
			if (sign == '/') {
				stack.push(stack.pop() / num);
			}
			sign = s.charAt(i);
			num = 0;
		}
	}

	int res = 0;
	for (int i : stack) {
		res += i;
	}
	return res;
}
使用变量存储结果

public int calculate(String s) {
	int res = 0, pre = 0, curr = 0;
	char sign = '+';
	char[] array = s.trim().toCharArray();
	for (int i = 0; i <= array.length; i++) {
		if (i != array.length 
				&& Character.isDigit(array[i]))
			curr = curr * 10 + array[i] - '0';
		else {
			if (i != array.length && array[i] == ' ')
				continue;
			if (sign == '+') {
				res += curr;
				pre = curr;
			}
			if (sign == '-') {
				res -= curr;
				pre = -curr;
			}
			if (sign == '*') {
				// 之前多加了一个pre(本身包括正负),现在减去
				res = res - pre + pre * curr;
				pre = pre * curr;
			}
			if (sign == '/') {
				res = res - pre + pre / curr;
				pre = pre / curr;
			}
			curr = 0;
			if (i != array.length)
				sign = array[i];
		}
	}
	return res;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值