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

224. Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

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

参考

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

只有非负整、+、-、空格、左括号、右括号,求计算结果

1. 没有括号时正常运算,将结果存入res中

2. 遇到左括号时将res及括号之前的运算符压栈

3. 遇到右括号时将当前值乘以左括号之前的符号(stack中取出),并加上左括号前的运算结果(stack中取出):

stack中存入的是遇到左括号时①括号之前计算结果res,②括号之前的运算符

public int calculate(String s) {

	Stack<Integer> stk = new Stack<>();
	// sign为1,可以考虑第一个数字没有符号的情况
	int sign = 1;
	int res = 0;
	for (int i = 0; i < s.length(); i++) {
		char ch = s.charAt(i);
		if (Character.isDigit(ch)) {
			int curSum = s.charAt(i) - '0';
			// 由于之前用了++i<s.length(),导致错误,
			// 原因是导致此if结束,又进去for循环,加了两次i
			// 使得结果出错.使用在while循环里,
			//如果不符合要求,不会自增,也就不会跳过符号位
			while (i + 1 < s.length() 
					&& Character.isDigit(s.charAt(i + 1)))
				curSum = curSum * 10 + s.charAt(++i) - '0';
			// res等于符号位乘以本次结果和之前的res之和
			res += sign * curSum;
		} else if (ch == '+')
			sign = 1;
		else if (ch == '-')
			sign = -1;
		// 遇到左括号时将res及括号之前的运算符压栈
		else if (ch == '(') {
			// 因res存入栈中,需要将res置为0,取出的时候从栈取res计算
			stk.push(res);
			res = 0;// 注意
			// sign置为1,已把sign放入栈中,重置
			stk.push(sign);// 注意
			sign = 1;
		} else if (ch == ')') {
			res = stk.pop() * res + stk.pop();
			// sign = 1;
		}
	}
	return res;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值