LeetCode——Basic Calculator II

Description:

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.

用两个操作栈来处理数据和操作符。先计算*和/然后变成加减法后再按顺序进行计算。

public class Solution {
    public static int calculate(String s) {
        Stack<Integer> num = new Stack<>();
        Stack<Character> op = new Stack<>();
        op.push('+');
        int n = s.length();
        if(n < 1) return 0;
        for(int i=0; i<n; ) {
        	if(s.charAt(i) == ' ') {
        		i ++;
        	}
        	else if(isOp(s.charAt(i))) {
        		op.push(s.charAt(i));
        		i ++;
        	}
        	else {
        		int temp = 0;
        		while(i < n && isDigit(s.charAt(i))) {
        			temp = temp * 10;
        			temp += s.charAt(i) - '0';
        			i ++;
        		}
        		if(!op.empty() && (op.peek()=='*' || op.peek()=='/')) {
        			if(op.peek() == '*') {
        				temp *= num.pop();
        				op.pop();
        			}
        			else {
        				temp = num.pop() / temp;
        				op.pop();
        			}
        		}
        		num.push(temp);
        	}
        }
        int res = 0;
        while (!op.empty()) {  
        	int temp = num.peek();  
        	//System.out.println(temp);
        	if (op.peek() == '-') temp = -temp;  
        	res += temp;  
        	num.pop();  
        	op.pop();  
        }  

        return res;
        
    }
	public static boolean isOp(char c) {
		if(c == '+' || c == '-' || c == '*' || c == '/') {
			return true;
		}
		else {
			return false;
		}
	}
	public static boolean isDigit(char c) {
		if(c >= '0' && c <='9') {
			return true;
		}
		else {
			return false;
		}
	}
}
原文地址:https://www.cnblogs.com/wxisme/p/4614857.html