USING Data Abstraction and Problem Solving with C 5th Editio

USING “Data Abstraction and Problem Solving with C++”, 5th Edition, Addison Wesley, 2006 (paperback), ISBN 0321433327 , ISBN-13: 9780321433329

The following is a grammar that allows you to omit parentheses in infix algebraic expression when the precedence rule remove ambiguity for example, a + b*c means a+ (b*c). however, the grammar does not permit left-to- right association when several operators have the same precedence. For example, a/b*c is illegal. notice that definitions introduce factors and terms.

< expression > = <term> | <term> + <term> | <term> - <term>

<term> = <factor > | < factor > * < factor > | < factor > / < factor >

<factor > = <letter> | (<expression>)

<letter>= a | b | … | z

The recognition algorithm is based on recursive chain of subtasks: find an expression \ ightarrow find a term \ ightarrow find a factor. What makes this a recursive chain is that find as expression uses find a term, which in turn uses find a factor. Find a factor either detects a base case or use find an expression, thus forming the recursive chain.

FIND AN EXPRESSION

// the grammar specifies that an expression is either

// a single term or a term followed by a + or a -,

// which then must be followed by a second term

Find a term

If (the next symbol is a + or a - )

{ Find a term }

FIND A TERM

// the grammar specifies that an expression is either a

// a single term or a term followed by a * or a /,

// which must then be followed by a second factor

Find a factor

If (the next symbol is a * or a /)

{ Find a factor }

Find A FACTOR

// the grammar specifies that an expression is either

// a single letter (the base case) or an

// expression enclosed in parentheses

If (the first symbol is a letter)

{ Done }

else if (the first symbol is a ‘(‘)

{ Find an expression starting at character after ‘(‘ Check for ‘)’ }

else

{ no factor exists }

Design and implement a class of infix expressions, as described by the given grammar. Include a method to recognize a legal infix expression.

Solution

Hope this will help-

import java.util.Stack;

public class EvaluateString
{
    public static int evaluate(String expression)
    {
        char[] tokens = expression.toCharArray();
        Stack<Integer> values = new Stack<Integer>();
        Stack<Character> ops = new Stack<Character>();
        for (int i = 0; i < tokens.length; i++)
        {
            if (tokens[i] == \' \')
                continue;

            if (tokens[i] >= \'0\' && tokens[i] <= \'9\')
            {
                StringBuffer sbuf = new StringBuffer();
                while (i < tokens.length && tokens[i] >= \'0\' && tokens[i] <= \'9\')
                    sbuf.append(tokens[i++]);
                values.push(Integer.parseInt(sbuf.toString()));
            }
            else if (tokens[i] == \'(\')
                ops.push(tokens[i]);
            else if (tokens[i] == \')\')
            {
                while (ops.peek() != \'(\')
                  values.push(applyOp(ops.pop(), values.pop(), values.pop()));
                ops.pop();
            }
            else if (tokens[i] == \'+\' || tokens[i] == \'-\' ||
                     tokens[i] == \'*\' || tokens[i] == \'/\')
            {
                while (!ops.empty() && hasPrecedence(tokens[i], ops.peek()))
                  values.push(applyOp(ops.pop(), values.pop(), values.pop()));
                ops.push(tokens[i]);
            }
        }
        while (!ops.empty())
            values.push(applyOp(ops.pop(), values.pop(), values.pop()));
        return values.pop();
    }
    public static boolean hasPrecedence(char op1, char op2)
    {
        if (op2 == \'(\' || op2 == \')\')
            return false;
        if ((op1 == \'*\' || op1 == \'/\') && (op2 == \'+\' || op2 == \'-\'))
            return false;
        else
            return true;
    }
    public static int applyOp(char op, int b, int a)
    {
        switch (op)
        {
        case \'+\':
            return a + b;
        case \'-\':
            return a - b;
        case \'*\':
            return a * b;
        case \'/\':
            if (b == 0)
                throw new UnsupportedOperationException(\"Cannot divide by zero\");
            return a / b;
        }
        return 0;
    }

    public static void main(String[] args)
    {
        System.out.println(EvaluateString.evaluate(\"10 + 2 * 6\"));//a+b*C expression
    }
}

USING “Data Abstraction and Problem Solving with C++”, 5th Edition, Addison Wesley, 2006 (paperback), ISBN 0321433327 , ISBN-13: 9780321433329 The following is
USING “Data Abstraction and Problem Solving with C++”, 5th Edition, Addison Wesley, 2006 (paperback), ISBN 0321433327 , ISBN-13: 9780321433329 The following is
USING “Data Abstraction and Problem Solving with C++”, 5th Edition, Addison Wesley, 2006 (paperback), ISBN 0321433327 , ISBN-13: 9780321433329 The following is

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site