Evaluate a Math Expression given in string form without using API

I want to evaluate an expression like -4-12-2*12-3-4*5 given in a String form without using API as I am a beginner and want to grasp the logic.

Given below is my unsuccessful attempt to this problem which, if you may like, ignore and suggest appropriate logic.And of course your codes are also welcome :-)

public class SolveExpression3 {

static String testcase1 = "-4-12-2*12-3-4*5";


public static void main(String args[]){
    SolveExpression3 testInstance= new SolveExpression3();
    int result = testInstance.solve(testcase1);
    System.out.println("Result is : "+result);
}

public int solve(String str){

    int sum = 1;
    int num1 = 0;
    int num2 = 0;
    String num = "";        
    int len = str.length();
    System.out.println(str);
    for (int i = len-1 ; i >= 0; i--)
    {
        char ch = str.charAt(i);            
        if(ch == '*')
        {
            String s = "";
            num1 = num2 = 0;
            //to get the number on left of *
            for (int j = i; j >= 0; j--)
            {
                char c = str.charAt(j);                 
                if(c == '+' || c == '-' || j == 1)
                {
                    num1 = stringToInt(s);
                    s = "";
                    break;
                }
                else
                {
                    s = c + s;
                }
            }
            //to get the number on right of *
            for (int j = i; j <= len; j++)
            {
                char c = str.charAt(j);                 
                if(c == '+' || c == '-' || j == len-1)
                {
                    num2 = stringToInt(s);
                    s = "";
                    break;
                }
                else
                {
                    s = c + s;
                }
            }
            sum = sum + num1*num2;

        }
        else
        {
            num = ch + num;             
        }
    }
    len = str.length();
    for (int i = len-1; i >= 0; i--)
    {
        char ch = str.charAt(i);
        if(ch==' ')
        {}
        else if(ch=='+')
        {
            sum = sum + stringToInt(num);               
            num = "";
        }
        else if(ch=='-')
        {
            sum = sum - stringToInt(num);               
            num = "";
        }
        else
        {
            num = ch + num;             
        }
    }
    return sum;
}

public int stringToInt(String str)
{
    int number=0;
    for(int i = 0; i < str.length(); i++)
    {
        int num = str.charAt(i) - 48;
        number = number*10+num;
    }
    return number;
}

}

Answers


        found=true;
        static String testcase1 = "-4-12-2*12-3-4*5";
        Pattern SEGMENT_PATTERN = Pattern.compile("(\\d+(\\.\\d+)?|\\D+)");
        /*\\d-means digit,
        \\.-point,
        +-one or more times,
        ?-optional and 
        \\D-non digit ch*/
        Matcher matcher = SEGMENT_PATTERN.matcher(testcase1);
        while (found) {
                    boolean Found = matcher.find();
                    String segment = matcher.group();//representing a number or an operator

                        if (Character.isDigit(segment.toCharArray()[0])) {
                            //is digit
                        }
                        else {
                            //is operator

                        }
                    }

This a a solution using a patter to determine if you have a number or and operator,u just have to adapt it a little to your case to computing the result.

You can add all the matches found to an array list than traverse it and test the operators and computer the result.

It works for floating numbers too,ex:"it matches 5.10".


I would suggest a different logic for your purpose.

Usually the logic behind programs algorithms is not different from the logic that you will apply if you have to do the task by hand.

For an expression like your example you would usually do:

  1. Find all the *
  2. For each * compute the result of the operation
  3. Repeat steps 1 and 2 for + and -

Try to implement a recursive descent parser, a tutorial depicting how a calculator can be implemented (in Python but the same concepts apply to java) can be found here http://blog.erezsh.com/how-to-write-a-calculator-in-70-python-lines-by-writing-a-recursive-descent-parser/


Need Your Help

*Update: How to parse html with python/ beautifulsoup

python html csv web-scraping beautifulsoup

First, I'm pretty new to Python. I'm trying to scrape contact information from offline websites and output the info to a csv. I'd like to grab the page url(not sure how to do this from the html), e...

HttpClient connecting to Https server

android https

While connecting to https server by skipping the SSL certificates(I mean allow all hosts) .

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.