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.
Example 1:
Input: "3+2*2" Output: 7
Example 2:
Input: " 3/2 " Output: 1
Example 3:
Input: " 3+5 / 2 " Output: 5
Note:
- You may assume that the given expression is always valid.
- Do not use the
eval
built-in library function.
class Solution { public int calculate(String s) { if(s==null || (s.length())==0) return 0; Stack<Integer> stack = new Stack<Integer>(); char lastsign = '+'; int num = 0; int le = s.length(); for(int i = 0; i < le; i++){ char c = s.charAt(i); if(Character.isDigit(c)) num = num * 10 + c - '0'; if(!Character.isDigit(c) && c != ' ' || i == le - 1){ switch (lastsign){ case '+': stack.push(num); break; case '-': stack.push(-num); break; case '*': stack.push(stack.pop() * num); break; case '/': stack.push(stack.pop() / num); break; } lastsign = c; num = 0; } } int res = 0; for(int i: stack) res += i; return res; } }
屌 https://leetcode.com/problems/basic-calculator-ii/discuss/63003/Share-my-java-solution
还有不用stack的方法:
public class Solution { public int calculate(String s) { if(s == null || s.length() == 0) { return 0; } s = s.trim(); int prevNum = 0; int sum = 0; char prevOp = '+'; for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); if(c == ' ') continue; if(Character.isDigit(c)) { int val = c - '0'; while(i + 1 < s.length() && Character.isDigit(s.charAt(i+1))) { val = val * 10 + (s.charAt(i+1) - '0'); i++; } if (prevOp == '+') { sum += prevNum; prevNum = val; } else if (prevOp == '-') { sum += prevNum; prevNum = -val; } else if (prevOp == '*') { prevNum = prevNum * val; } else if (prevOp == '/') { prevNum = prevNum/val; } } else { prevOp = c; } } sum += prevNum; return sum; } }