Question
You will only need to complete two methods in InfixExpressionEvaluator class: private String convertToPostfix(String infix) private double evaluatePostfix (String postfix) ------------------ Readme.txt - Please see
You will only need to complete two methods in InfixExpressionEvaluator class:
private String convertToPostfix(String infix) private double evaluatePostfix (String postfix)
------------------
Readme.txt
- Please see project requirements in InfixExpressionEvaluator.java
- Specification I have modified specification and requirements of this project You will need to complete two methods in InfixExpressionEvaluator class:
private String convertToPostfix(String infix) private double evaluatePostfix (String postfix)
Algorithms are given in InfixExpressionEvaluator class.
- Requirements
- A set of valid variable names (single character) and their corresponding values (double) will be needed - Assume all infix expressions are valid - Valid tokens in an expression are '(',')','+','-','*','/',and valid variable names - Display result as floting point number with at 2 decimal places
- There may be any number of blank spaces, >= 0, in between tokens and any number of parethesis. Thus, the following expressions are valid: ((a + b) - c) (( a+b)) * c / d ((((( a ))))) - Must use Java API java.util.Stack
- Compile and run program javac *.java // Run tests in InfixExpressionEvaluator class java QuickTest java UserInputTest
- Sample Run
================================================================================== $ java QuickTest
Variable table for quick test
Variable table :{A=5.5, B=-4.5, C=90.0, D=-5.0}
Convert infix expression to postfix expression: (A) Equivalent postfix: A
Convert infix expression to postfix expression: (A+(B+C)) Equivalent postfix: ABC++
Convert infix expression to postfix expression: (A*(B+C)) Equivalent postfix: ABC+*
Convert infix expression to postfix expression: (A-(B+C)/D) Equivalent postfix: ABC+D/-
Convert infix expression to postfix expression: A*(B+C-D) Equivalent postfix: ABC+D-*
Convert infix expression to postfix expression: A*B+(C-D)-D*B Equivalent postfix: AB*CD-+DB*-
Evaluate postfix expression: A Result : 5.50
Evaluate postfix expression: ABC++ Result : 91.00
Evaluate postfix expression: ABC+* Result : 470.25
Evaluate postfix expression: ABC+D/- Result : 22.60
Evaluate postfix expression: ABC+D-* Result : 497.75
Evaluate postfix expression: AB*CD-+DB*- Result : 47.75
==================================================================================
$ java UserInputTest
Create Variable Table, please input variable info:
Enter name and value, example: A 3.5 (enter 0 0 to exit) : A 3.5 Enter name and value, example: A 3.5 (enter 0 0 to exit) : B -4 Enter name and value, example: A 3.5 (enter 0 0 to exit) : C 9 Enter name and value, example: A 3.5 (enter 0 0 to exit) : D -5.5 Enter name and value, example: A 3.5 (enter 0 0 to exit) : 0 0
Variable table :{A=3.5, B=-4.0, C=9.0, D=-5.5}
Start to evaluate infix expressions.... Enter a valid infix expression string (enter "exit" to terminate):(((( A )))) Evaluate expression #1 : (((( A )))) Equivalent postfix: A Result : 3.50 Enter a valid infix expression string (enter "exit" to terminate):(A+B)*C/D Evaluate expression #2 : (A+B)*C/D Equivalent postfix: AB+C*D/ Result : 0.82 Enter a valid infix expression string (enter "exit" to terminate):A*B*C/D Evaluate expression #3 : A*B*C/D Equivalent postfix: AB*C*D/ Result : 22.91 Enter a valid infix expression string (enter "exit" to terminate):A+B*C+D Evaluate expression #4 : A+B*C+D Equivalent postfix: ABC*+D+ Result : -38.00 Enter a valid infix expression string (enter "exit" to terminate):((A)+B) Evaluate expression #5 : ((A)+B) Equivalent postfix: AB+ Result : -0.50 Enter a valid infix expression string (enter "exit" to terminate):exit
==================================================================================
The following is the InfixExpressionEvaluator.java:
/** * Implement methods: * private String convertToPostfix(String infix) * private double evaluatePostfix(String postfix) * * Look at algorithms in the methods */
import java.util.*;
public class InfixExpressionEvaluator { // This is a variable table. It contains
/** Convert a valid infix expression to a postfix expression Must only use variable names as defined in variable table
@param infix : A valid infix expression. @return Equivalent postfix expression */
private String convertToPostfix(String infix) {
/* Task: Convert an infix expression to a postfix expression
Use Stack
Need to consider : ( & ), precedence of operators and left to right association
Step 1. Process each character ch in infix expression from left to right
switch(ch) { case operand : append to PE; break; case ( : S.push(ch); break; case ) : repeat // loop until ( { symbol = S.pop() if symbol != ( then append to PE else exit loop } break; case operator : get TopSymbol from S if S is not empty while (!S.isEmpty()) and (TopSymbol != () and (precedence(ch) <= precedence(TopSymbol)) { symbol = S.pop() append symbol to PE get TopSymbol from S if S is not empty } S.push(ch) break; } // end switch
Step 2. After scanning the whole infix expression. Append remaining operators in S into PE
while (Stack != empty) { symbol = S.pop(); append symbol to PE }
Return PE.toString() // convert StringBuffer to String
Example : (a*b+c) (d-e*f) == ab*c+def*--
Char Stack PE ( ( a ( a * (* a b (* ab + (+ ab* c (+ ab*c ) ab*c+ - - ab*c+ ( -( ab*c+ d -( ab*c+d - -(- ab*c+d e -(- ab*c+de * -(-* ab*c+de f -(-* ab*c+def ) - ab*c+def*- ab*c+def*-- */
return null; //change it } // end convertToPostfix
/** Evaluates a postfix expression. Must only use variable names as defined in variable table
@param postfix : A valid postfix expression. @return The double result of the postfix expression. */
private double evaluatePostfix(String postfix) { /* Task: Evaluate a postfix expression
Use a Stack
if a character is an operand : push into S if a character is an operator : pop two operands from S evaluate the result (need to consider +,-,*,/) push the result back to S Final result is in S
Hint: Use getVariableValue(X) to get value of variable X Use checkValidVariable(X) to check if X is a variable Use checkValidOperator(X) to check if X is an operator Example : Let A=2, B=3, C=4, D=5.
Evaluate postfix expr ABC+*D- 234+*5- = 2 * (3+4) 5 = 9
Char Stack 2 2 3 2,3 4 2,3,4 + 2,7 // 3 + 4 * 14 // 2 * 7 5 14,5 - 9 // 14 - 5
Result = 9
*/
return 0.0; // change it } // end evaluatePostfix
// add any additional private methods here...... // ....
//---------------------------------------------------------------- // Do not modify anything below //---------------------------------------------------------------- // Check a character op is a valid operator, i.e. +, -, * or / private boolean checkValidOperator(char op) { return ((op == '+') || (op == '-') || (op == '*') || (op == '/')); }
// Check variable var is defined in variable table private boolean checkValidVariable(char var) { return variableValues.containsKey(var); }
// Retrieve variable values from variable table private double getVariableValue(char var) { return variableValues.get(var).doubleValue(); } // Read variable values into a variable table void setupVariables() { Scanner s = new Scanner(System.in); char var = 'A'; double val = 3.5; System.out.println(" Create Variable Table, please input variable info: "); while (var != '0') { System.out.print("Enter name and value, example: A 3.5 (enter 0 0 to exit) : "); var = s.next().charAt(0); val = s.nextDouble(); if (var == '0') continue; variableValues.put(var, val); } System.out.println(" Variable table :" + variableValues); }
// This starts infix evaluations // Must enter valid infix expressions, otherwise, may get unexpected results // Enter "exit" to terminate loop void evaluate() { Scanner scanner; String inputInfix; String postfix; double result; int i=0;
System.out.println(" Start to evaluate infix expressions...."); scanner = new Scanner( System.in ); // scanner for input do { try { System.out.print( "Enter a valid infix expression string (enter \"exit\" to terminate):" );
// scan next input line inputInfix = scanner.nextLine();
if (inputInfix.equals("exit")) break; // loop
i++; System.out.println(" Evaluate expression #"+ i+" : " + inputInfix); postfix=convertToPostfix(inputInfix); System.out.println(" Equivalent postfix: " + postfix); result =evaluatePostfix(postfix); System.out.printf(" Result : %.2f ", result); } catch (Exception e) { System.out.println(" Exception...."+e.getMessage()); }
} while ( true ); // end do...while }
// Run quick tests void quickTest() { char var = 'A'; double val = 3.5; String inputInfix=null; String postfix=null;
System.out.println(" Variable table for quick test"); variableValues.put('A', 5.5); variableValues.put('B', -4.5); variableValues.put('C', 90.0); variableValues.put('D', -5.0); System.out.println(" Variable table :" + variableValues);
inputInfix="(A)"; System.out.println(" Convert infix expression to postfix expression: " + inputInfix); System.out.println("Equivalent postfix: " + convertToPostfix(inputInfix));
inputInfix="(A+(B+C))"; System.out.println(" Convert infix expression to postfix expression: " + inputInfix); System.out.println("Equivalent postfix: " + convertToPostfix(inputInfix));
inputInfix="(A*(B+C))"; System.out.println(" Convert infix expression to postfix expression: " + inputInfix); System.out.println("Equivalent postfix: " + convertToPostfix(inputInfix));
inputInfix="(A-(B+C)/D)"; System.out.println(" Convert infix expression to postfix expression: " + inputInfix); System.out.println("Equivalent postfix: " + convertToPostfix(inputInfix));
inputInfix="A*(B+C-D)"; System.out.println(" Convert infix expression to postfix expression: " + inputInfix); System.out.println("Equivalent postfix: " + convertToPostfix(inputInfix));
inputInfix="A*B+(C-D)-D*B"; System.out.println(" Convert infix expression to postfix expression: " + inputInfix); System.out.println("Equivalent postfix: " + convertToPostfix(inputInfix));
postfix="A"; System.out.println(" Evaluate postfix expression: " + postfix); System.out.printf("Result : %.2f ", evaluatePostfix(postfix));
postfix="ABC++"; System.out.println(" Evaluate postfix expression: " + postfix); System.out.printf("Result : %.2f ", evaluatePostfix(postfix));
postfix="ABC+*"; System.out.println(" Evaluate postfix expression: " + postfix); System.out.printf("Result : %.2f ", evaluatePostfix(postfix));
postfix="ABC+D/-"; System.out.println(" Evaluate postfix expression: " + postfix); System.out.printf("Result : %.2f ", evaluatePostfix(postfix));
postfix="ABC+D-*"; System.out.println(" Evaluate postfix expression: " + postfix); System.out.printf("Result : %.2f ", evaluatePostfix(postfix));
postfix="AB*CD-+DB*-"; System.out.println(" Evaluate postfix expression: " + postfix); System.out.printf("Result : %.2f ", evaluatePostfix(postfix));
variableValues.clear(); }
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*This QuickTest.java is just to test if InfixExpressionEvaluator works, you don't have to modify anything.
QuickTest.java
import java.util.*;
public class QuickTest
{
public static void main(String[] args)
{
InfixExpressionEvaluator expr = new InfixExpressionEvaluator();
expr.quickTest();
} // end main
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*This UserInputTest.java is just to test if InfixExpressionEvaluator works, you don't have to modify anything.
UserInputTest.java
import java.util.*;
public class UserInputTest
{
public static void main(String[] args)
{
InfixExpressionEvaluator expr = new InfixExpressionEvaluator();
expr.setupVariables();
expr.evaluate();
} // end main
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started