Skip to main content
Tweeted twitter.com/StackCodeReview/status/1314717421396283393
Became Hot Network Question
added 571 characters in body
Source Link
vnp
  • 57.3k
  • 4
  • 51
  • 140
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
import java.lang.Exception;

public class Solution{

Stack<Integer> numberStack = new Stack();
Stack<Character> operatorStack = new Stack();

//assuming op1 is in operator stack and op2 is to be inserted
public boolean hasPrecedence(char op1, char op2){
    if (op2 == '/' && op1 != '/'){
        return true;
    }
    
    if (op2 == '*' && (op1 == '+' || op1 == '-')){
        return true;
    }
    
    return false;
}

// -1 means invalid
//  0 means number
//  1 means an operator
public int validate(char operand){
    booleanStack<Integer> isNumbernumberStack = false;
    ifnew (Character.isDigitStack(operand)){
        isNumber = true; 
    }
    boolean isOperator = false;
    if (operand != '/' || operand !='*' || operand !='+' || operand != '-'){;
       Stack<Character> isOperatoroperatorStack = true;
    }
    
    if (!(isNumber || isOperator)){
        return -1;
    }
    
    ifnew Stack(isNumber){
        return 0;
    };
    
    //assuming op1 is in operator stack and op2 is to be inserted
    public boolean hasPrecedence(char op1, char op2){
        if (isOperatorop2 == '/' && op1 != '/'){
            return 1;true;
        }
        
        if (op2 == '*' && (op1 == '+' || op1 == '-')){
            return true;
        }
        
        return false;
    }
    
    return// -1;
}

private void performOperation(){
    if(operatorStack.empty()1 ||means numberStack.empty()){invalid
    //  0 means return;number
    }
//  1 means charan operator = operatorStack.pop();
    if(numberStack.size() < 2){
        return;
    }
    int num2 = numberStack.pop();
   public int num1 = numberStack.popvalidate();
    int result = 0;
   char switch(operatoroperand){
        case '/':boolean resultisNumber = num1/num2;false;
                 if numberStack(Character.pushisDigit(resultoperand);){
                  break;
        case '+': resultisNumber = num1+num2;
                 true; numberStack.push(result);
                  break;}
        case '*':boolean resultisOperator = num1*num2;false;
                 if numberStack.push(result);
               operand != '/' break;
|| operand !='*' || operand !='+' || operand case!= '-': result = num1-num2;
                  numberStack.push(result);{
                isOperator = break;true;
    }         }
        
        if (!(isNumber || isOperator)){
            return -1;
        }
        
private int calculate(String exp) throws Exception   if (isNumber){
            return 0;
    if (exp == null ||}
 exp.trim().length() == 0     
        if (isOperator){
        throw new Exception("Null or emptyreturn expression1;
 ");       }
        
        return -1;
    }
    char[] operArray = exp.toCharArray();
    StringBuffer numberBuffer = new StringBuffer();
    
    
    char operand = '\0';
   private forvoid performOperation(int i=0; i < operArray.length ; i++){
        operand = operArray[i];
        if (CharacteroperatorStack.isWhitespaceempty(operand) || numberStack.empty()){
            continue;return;
        }
        int opVal = -1;
       char opValoperator = validateoperatorStack.pop(operand);
        if (opValnumberStack.size() ==< -12){
            throw new Exception("Invalid inputs ");return;
        }
        int num2 = numberStack.pop();
        int num1 = numberStack.pop();
        int result = 0;
        switch(operator){
            case '/': result = num1/num2;
                      numberStack.push(result);
                      break;
            case '+': result = num1+num2;
                      numberStack.push(result);
                      break;
            case '*': result = num1*num2;
                      numberStack.push(result);
                      break;
            case '-': result = num1-num2;
                      numberStack.push(result);
                      break;
        }         
            
    }
            
    private int calculate(String exp) throws Exception{
        
        //current char is number
    if (exp == null if|| exp.trim(opVal).length() == 0 ){
            numberBuffer.append(operand);
      throw new Exception("Null or empty expression continue;");
        }
        char[] operArray = exp.toCharArray();
        StringBuffer numberBuffer = new StringBuffer();
        
        if (opVal == 1){
            numberStack.push(Integer.parseInt(numberBuffer.toString()));
            numberBuffer = new StringBuffer();
        
        char operand = '\0';
        for (int i=0; i < operArray.length ; i++){
            operand = operArray[i];
            if (Character.isWhitespace(operand)){
                continue;
            }
            int opVal = -1;
            opVal = validate(operand);
            if (opVal == -1){
                throw new Exception("Invalid inputs ");
            }
            
            //current char is number
            if (opVal == 0){
                numberBuffer.append(operand);
                continue;
            }
            
            if (opVal == 1){
                numberStack.push(Integer.parseInt(numberBuffer.toString()));
                numberBuffer = new StringBuffer();
            
                if (!operatorStack.empty()){
                    if(!hasPrecedence(operatorStack.peek(), operand)){
                        performOperation();
                    }
                }
                    operatorStack.push(operand);
            }
                operatorStack.push(operand);
        }
    }
    
        numberStack.push(Integer.parseInt(numberBuffer.toString()));
        while(!operatorStack.isEmpty()){
            performOperation();
        }
        return numberStack.pop();
    }
    return numberStack.pop();
}

    public static void main(String []args) throws Exception{
        Solution expparser = new Solution();
        int result = expparser.calculate("3+2*2");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3/2 ");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3+5 / 2 ");
        System.out.println("result is " + result);
        result = expparser.calculate("3+2-2");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3/2-1 ");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3/5/2 ");
        System.out.println("result is " + result);
        result = expparser.calculate("3/5*2");
        System.out.println("result is " + result);
        result = expparser.calculate("3*5*2");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3+5+2 ");
        System.out.println("result is " + result);
    }
}
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
import java.lang.Exception;

public class Solution{

Stack<Integer> numberStack = new Stack();
Stack<Character> operatorStack = new Stack();

//assuming op1 is in operator stack and op2 is to be inserted
public boolean hasPrecedence(char op1, char op2){
    if (op2 == '/' && op1 != '/'){
        return true;
    }
    
    if (op2 == '*' && (op1 == '+' || op1 == '-')){
        return true;
    }
    
    return false;
}

// -1 means invalid
//  0 means number
//  1 means an operator
public int validate(char operand){
    boolean isNumber = false;
    if (Character.isDigit(operand)){
        isNumber = true; 
    }
    boolean isOperator = false;
    if (operand != '/' || operand !='*' || operand !='+' || operand != '-'){
        isOperator = true;
    }
    
    if (!(isNumber || isOperator)){
        return -1;
    }
    
    if (isNumber){
        return 0;
    }
    
    if (isOperator){
        return 1;
    }
    
    return -1;
}

private void performOperation(){
    if(operatorStack.empty() || numberStack.empty()){
        return;
    }
    char operator = operatorStack.pop();
    if(numberStack.size() < 2){
        return;
    }
    int num2 = numberStack.pop();
    int num1 = numberStack.pop();
    int result = 0;
    switch(operator){
        case '/': result = num1/num2;
                  numberStack.push(result);
                  break;
        case '+': result = num1+num2;
                  numberStack.push(result);
                  break;
        case '*': result = num1*num2;
                  numberStack.push(result);
                  break;
        case '-': result = num1-num2;
                  numberStack.push(result);
                  break;
    }         
        
}
        
private int calculate(String exp) throws Exception{
    
    if (exp == null || exp.trim().length() == 0 ){
        throw new Exception("Null or empty expression ");
    }
    char[] operArray = exp.toCharArray();
    StringBuffer numberBuffer = new StringBuffer();
    
    
    char operand = '\0';
    for (int i=0; i < operArray.length ; i++){
        operand = operArray[i];
        if (Character.isWhitespace(operand)){
            continue;
        }
        int opVal = -1;
        opVal = validate(operand);
        if (opVal == -1){
            throw new Exception("Invalid inputs ");
        }
        
        //current char is number
        if (opVal == 0){
            numberBuffer.append(operand);
            continue;
        }
        
        if (opVal == 1){
            numberStack.push(Integer.parseInt(numberBuffer.toString()));
            numberBuffer = new StringBuffer();
        
            if (!operatorStack.empty()){
                if(!hasPrecedence(operatorStack.peek(), operand)){
                    performOperation();
                }
            }
                operatorStack.push(operand);
        }
    }
    
    numberStack.push(Integer.parseInt(numberBuffer.toString()));
    while(!operatorStack.isEmpty()){
        performOperation();
    }
    return numberStack.pop();
}

public static void main(String []args) throws Exception{
    Solution expparser = new Solution();
    int result = expparser.calculate("3+2*2");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3/2 ");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3+5 / 2 ");
    System.out.println("result is " + result);
    result = expparser.calculate("3+2-2");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3/2-1 ");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3/5/2 ");
    System.out.println("result is " + result);
    result = expparser.calculate("3/5*2");
    System.out.println("result is " + result);
    result = expparser.calculate("3*5*2");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3+5+2 ");
    System.out.println("result is " + result);
}
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
import java.lang.Exception;

public class Solution{
    
    Stack<Integer> numberStack = new Stack();
    Stack<Character> operatorStack = new Stack();
    
    //assuming op1 is in operator stack and op2 is to be inserted
    public boolean hasPrecedence(char op1, char op2){
        if (op2 == '/' && op1 != '/'){
            return true;
        }
        
        if (op2 == '*' && (op1 == '+' || op1 == '-')){
            return true;
        }
        
        return false;
    }
    
    // -1 means invalid
    //  0 means number
    //  1 means an operator
    public int validate(char operand){
        boolean isNumber = false;
        if (Character.isDigit(operand)){
            isNumber = true; 
        }
        boolean isOperator = false;
        if (operand != '/' || operand !='*' || operand !='+' || operand != '-'){
            isOperator = true;
        }
        
        if (!(isNumber || isOperator)){
            return -1;
        }
        
        if (isNumber){
            return 0;
        }
        
        if (isOperator){
            return 1;
        }
        
        return -1;
    }
    
    private void performOperation(){
        if(operatorStack.empty() || numberStack.empty()){
            return;
        }
        char operator = operatorStack.pop();
        if(numberStack.size() < 2){
            return;
        }
        int num2 = numberStack.pop();
        int num1 = numberStack.pop();
        int result = 0;
        switch(operator){
            case '/': result = num1/num2;
                      numberStack.push(result);
                      break;
            case '+': result = num1+num2;
                      numberStack.push(result);
                      break;
            case '*': result = num1*num2;
                      numberStack.push(result);
                      break;
            case '-': result = num1-num2;
                      numberStack.push(result);
                      break;
        }         
            
    }
            
    private int calculate(String exp) throws Exception{
        
        if (exp == null || exp.trim().length() == 0 ){
            throw new Exception("Null or empty expression ");
        }
        char[] operArray = exp.toCharArray();
        StringBuffer numberBuffer = new StringBuffer();
        
        
        char operand = '\0';
        for (int i=0; i < operArray.length ; i++){
            operand = operArray[i];
            if (Character.isWhitespace(operand)){
                continue;
            }
            int opVal = -1;
            opVal = validate(operand);
            if (opVal == -1){
                throw new Exception("Invalid inputs ");
            }
            
            //current char is number
            if (opVal == 0){
                numberBuffer.append(operand);
                continue;
            }
            
            if (opVal == 1){
                numberStack.push(Integer.parseInt(numberBuffer.toString()));
                numberBuffer = new StringBuffer();
            
                if (!operatorStack.empty()){
                    if(!hasPrecedence(operatorStack.peek(), operand)){
                        performOperation();
                    }
                }
                    operatorStack.push(operand);
            }
        }
        
        numberStack.push(Integer.parseInt(numberBuffer.toString()));
        while(!operatorStack.isEmpty()){
            performOperation();
        }
        return numberStack.pop();
    }

    public static void main(String []args) throws Exception{
        Solution expparser = new Solution();
        int result = expparser.calculate("3+2*2");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3/2 ");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3+5 / 2 ");
        System.out.println("result is " + result);
        result = expparser.calculate("3+2-2");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3/2-1 ");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3/5/2 ");
        System.out.println("result is " + result);
        result = expparser.calculate("3/5*2");
        System.out.println("result is " + result);
        result = expparser.calculate("3*5*2");
        System.out.println("result is " + result);
        result = expparser.calculate(" 3+5+2 ");
        System.out.println("result is " + result);
    }
}
added 30 characters in body
Source Link
vnp
  • 57.3k
  • 4
  • 51
  • 140

Input: "3+2*2" Output: 7 Example 2:

Input: "3+2*2"
Output: 7

Input: " 3/2 " Output: 1 Example 3Example 2:

Input: " 3/2 "
Output: 1

Input: " 3+5 / 2 " OutputExample 3: 5

Input: " 3+5 / 2 "
Output: 5

}

Input: "3+2*2" Output: 7 Example 2:

Input: " 3/2 " Output: 1 Example 3:

Input: " 3+5 / 2 " Output: 5

}

Input: "3+2*2"
Output: 7

Example 2:

Input: " 3/2 "
Output: 1

Example 3:

Input: " 3+5 / 2 "
Output: 5
Source Link

leet code calculator II code

This is a problem that is asked on leet code for a simple calculator. The problem is stated as follows -

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.

This is the code I wrote in a short span of time, I did not design it for more complicated cases -

import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
import java.lang.Exception;

public class Solution{

Stack<Integer> numberStack = new Stack();
Stack<Character> operatorStack = new Stack();

//assuming op1 is in operator stack and op2 is to be inserted
public boolean hasPrecedence(char op1, char op2){
    if (op2 == '/' && op1 != '/'){
        return true;
    }
    
    if (op2 == '*' && (op1 == '+' || op1 == '-')){
        return true;
    }
    
    return false;
}

// -1 means invalid
//  0 means number
//  1 means an operator
public int validate(char operand){
    boolean isNumber = false;
    if (Character.isDigit(operand)){
        isNumber = true; 
    }
    boolean isOperator = false;
    if (operand != '/' || operand !='*' || operand !='+' || operand != '-'){
        isOperator = true;
    }
    
    if (!(isNumber || isOperator)){
        return -1;
    }
    
    if (isNumber){
        return 0;
    }
    
    if (isOperator){
        return 1;
    }
    
    return -1;
}

private void performOperation(){
    if(operatorStack.empty() || numberStack.empty()){
        return;
    }
    char operator = operatorStack.pop();
    if(numberStack.size() < 2){
        return;
    }
    int num2 = numberStack.pop();
    int num1 = numberStack.pop();
    int result = 0;
    switch(operator){
        case '/': result = num1/num2;
                  numberStack.push(result);
                  break;
        case '+': result = num1+num2;
                  numberStack.push(result);
                  break;
        case '*': result = num1*num2;
                  numberStack.push(result);
                  break;
        case '-': result = num1-num2;
                  numberStack.push(result);
                  break;
    }         
        
}
        
private int calculate(String exp) throws Exception{
    
    if (exp == null || exp.trim().length() == 0 ){
        throw new Exception("Null or empty expression ");
    }
    char[] operArray = exp.toCharArray();
    StringBuffer numberBuffer = new StringBuffer();
    
    
    char operand = '\0';
    for (int i=0; i < operArray.length ; i++){
        operand = operArray[i];
        if (Character.isWhitespace(operand)){
            continue;
        }
        int opVal = -1;
        opVal = validate(operand);
        if (opVal == -1){
            throw new Exception("Invalid inputs ");
        }
        
        //current char is number
        if (opVal == 0){
            numberBuffer.append(operand);
            continue;
        }
        
        if (opVal == 1){
            numberStack.push(Integer.parseInt(numberBuffer.toString()));
            numberBuffer = new StringBuffer();
        
            if (!operatorStack.empty()){
                if(!hasPrecedence(operatorStack.peek(), operand)){
                    performOperation();
                }
            }
                operatorStack.push(operand);
        }
    }
    
    numberStack.push(Integer.parseInt(numberBuffer.toString()));
    while(!operatorStack.isEmpty()){
        performOperation();
    }
    return numberStack.pop();
}

public static void main(String []args) throws Exception{
    Solution expparser = new Solution();
    int result = expparser.calculate("3+2*2");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3/2 ");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3+5 / 2 ");
    System.out.println("result is " + result);
    result = expparser.calculate("3+2-2");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3/2-1 ");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3/5/2 ");
    System.out.println("result is " + result);
    result = expparser.calculate("3/5*2");
    System.out.println("result is " + result);
    result = expparser.calculate("3*5*2");
    System.out.println("result is " + result);
    result = expparser.calculate(" 3+5+2 ");
    System.out.println("result is " + result);
}

}

Considering there are no negative numbers in the expression, this code works fine and the test cases have all passed. How can I improve this code?