Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Program in JAVA. Using the provided skeleton code, finish the program that evaluates mathematical expressions. You will be provided with a skeleton code for the

Program in JAVA.

Using the provided skeleton code, finish the program that evaluates mathematical expressions.

You will be provided with a skeleton code for the EVALUATOR class. The program should use the utility classes OPERAND and OPERATOR. The Evaluator implements a single public method, eval (a String parameter that represents a mathematical expression), parses and evaluates the expression, and returns the integer result.

Ex. 2 + 3 * 5, would be evaluated to 17.

PROCEDURES

The expressions are composed of integer operands consisting of +, -, *, /, ^, (, and ). Operational priorities need to be considered.

The algorithm will implement TWO STACKS; one for operators and one for operands. The algorithm will implement logic as follows:

1) If an operand token is scanned, an Operand object is created from the token, and pushed to the operand Stack

2) If an operator token is scanned, and the operator Stack is empty, then an Operator object is created from the token, and pushed to the operator Stack

3) If an operator token is scanned, and the operator Stack is not empty, and the operators precedence is greater than the precedence of the Operator at the top of the Stack, then and Operator object is created from the token, and pushed to the operator Stack

4) If the token is (, and Operator object is created from the token, and pushed to the operator Stack

5) If the token is ), the process Operators until the corresponding ( is encountered. Pop the ( Operator.

6) If none of the above cases apply, process an Operator.

Processing an Operator means to:

* Pop the operand Stack twice (for each operand - note the order!!)

* Pop the operator Stack

* Execute the Operator with the two Operands

* Push the result onto the operand Stack

When all tokens are read, process Operators until the operator Stack is empty

REQUIREMENTS

Requirement 1: Implement the above algorithm within the Evaluator class.

Requirement 2: Test this implementation with expressions that test all possible cases (you may use the included EvaluatorTest class to do this, or create JUnit tests).

Requirement 3: Implement the following class hierarchy

Within Operator:

* Operator must be an abstract superclass.

* boolean check( String token ) - returns true if the specified token is an operator

* abstract int priority() - returns the precedence of the operator

* abstract Operand execute( Operand operandOne, Operand operandTwo ) - performs a mathematical calculation dependent on its type

* This class should contain a HashMap with all of the Operators stored as values, keyed by their token. An interface should be created in Operator to allow the Evaluator (or other software components in our system) to look up Operators by token.

* Individual Operator classes must be subclassed from Operator to implement each of the operations allowed in our expressions

Within Operand:

* boolean check( String token ) - returns true if the specified token is an operand

* Operand( String token ) - Constructor

* Operand( int value ) - Constructor

* int getValue() - returns the integer value of this operand

*********************************EVALUATOR.JAVA****************************************

import java.util.*;

public class Evaluator { private Stack operandStack; private Stack operatorStack;

private StringTokenizer tokenizer; private static final String DELIMITERS = "+-*^/ ";

public Evaluator() { operandStack = new Stack<>(); operatorStack = new Stack<>(); }

public int eval( String expression ) { String token;

// The 3rd argument is true to indicate that the delimiters should be used // as tokens, too. But, we'll need to remember to filter out spaces. this.tokenizer = new StringTokenizer( expression, DELIMITERS, true );

// initialize operator stack - necessary with operator priority schema // the priority of any operator in the operator stack other than // the usual mathematical operators - "+-*/" - should be less than the priority // of the usual operators

while ( this.tokenizer.hasMoreTokens() ) { // filter out spaces if ( !( token = this.tokenizer.nextToken() ).equals( " " )) { // check if token is an operand if ( Operand.check( token )) { operandStack.push( new Operand( token )); } else { if ( ! Operator.check( token )) { System.out.println( "*****invalid token******" ); System.exit( 1 ); }

// ( The Operator class should contain an instance of a HashMap, // and values will be instances of the Operators. See Operator class // skeleton for an example. ) Operator newOperator = new Operator( token );

while ( operatorStack.peek().priority() >= newOperator.priority() ) { // note that when we eval the expression 1 - 2 we will // push the 1 then the 2 and then do the subtraction operation // This means that the first number to be popped is the // second operand, not the first operand - see the following code Operator oldOpr = operatorStack.pop(); Operand op2 = operandStack.pop(); Operand op1 = operandStack.pop(); operandStack.push( oldOpr.execute( op1, op2 )); }

operatorStack.push( newOperator ); } } }

// Control gets here when we've picked up all of the tokens; you must add // code to complete the evaluation - consider how the code given here // will evaluate the expression 1+2*3 // When we have no more tokens to scan, the operand stack will contain 1 2 // and the operator stack will have + * with 2 and * on the top; // In order to complete the evaluation we must empty the stacks (except // the init operator on the operator stack); that is, we should keep // evaluating the operator stack until it only contains the init operator; // Suggestion: create a method that takes an operator as argument and // then executes the while loop; also, move the stacks out of the main // method return 0; } }

*********************************OPERAND.JAVA****************************************

public class Operand {

public Operand( String token ) {

}

public Operand( int value ) {

}

public int getValue() {

}

public static boolean check( String token ) {

} }

*********************************OPERATOR.JAVA****************************************

public abstract class Operator { // The Operator class should contain an instance of a HashMap // This map will use keys as the tokens we're interested in, // and values will be instances of the Operators.

public abstract int priority(); public abstract Operand execute( Operand op1, Operand op2 );

public static boolean check( String token ) {

} }

THANK YOU!

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Practical Issues In Database Management A Refernce For The Thinking Practitioner

Authors: Fabian Pascal

1st Edition

0201485559, 978-0201485554

More Books

Students also viewed these Databases questions

Question

8. Measure the effectiveness of the succession planning process.

Answered: 1 week ago