Follow these steps: For this task, you are required to refactor the badly written program RPN.java. This program is a Reverse-Polish Notation calculator which uses a stack. A Reverse-Polish Notation calculator is a calculator that will calculate equations where the operator follows the operands. Therefore, instead of inputting an equation as "1 + 2", a Reverse-Polish Notation calculator would take the following input *12+" A stack is a data structure in which items are added to the top of the stack and removed from the top of the stack. It is therefore known as a last-in, first-out (LIFO) data structure. Stack terminology. o Push - is an operation that adds an item to the top of a stack. o Pop - is an operation that removes an item from the top of a stack. The pseudocode for this program is: o Get an equation (e.g. 23+) from the user as input. o Loop through the string value input by the user. ■ When you encounter a number (remember that numbers can include decimal points), add it to the stack (push). When you encounter an operator (e.g. +, -, /, etc.), pop two numbers from the stack and perform the appropriate calculation. o Display the answer of the calculation to the user. For this task you are required to: o Troubleshoot and debug the code so that it runs correctly.
import java.util.Scanner;
class StackNode {
public StackNode(double data, StackNode underneath) {
this.data = data;
this.underneath = underneath;
}
public StackNode underneath;
public double data;
}
class RPN {
public void into(double new_data) {
StackNode new_node = new StackNode(new_data, top);
top = new_node;
}
public double outof( ) {
double top_data = top.data;
top = top.underneath;
return top_data;
}
public RPN(String command) {
top = null;
this.command = command;
}
public double get( ) {
double a, b;
int j;
for(int i = 0; i < command.length( ); i++) {
// if it's a digit
if(Character.isDigit(command.charAt(i))) {
double number;
// get a string of the number
String temp = "";
for(j = 0; (j < 100) && (Character.isDigit(command.charAt(i)) || (command.charAt(i) == '.')); j++, i++) {
temp = temp + String.valueOf(command.charAt(i));
}
// convert to double and add to the stack
number = Double.parseDouble(temp);
into(number);
} else if(command.charAt(i) == '+') {
b = outof( );
a = outof( );
into(a + b);
} else if(command.charAt(i) == '-') {
b = outof( );
a = outof( );
into(a - b);
} else if(command.charAt(i) == '*') {
b = outof( );
a = outof( );
into(a * b);
} else if(command.charAt(i) == '/') {
b = outof( );
a = outof( );
into(a / b);
}
else if(command.charAt(i) == '^') {
b = outof( );
a = outof( );
into(Math.pow(a, b));
} else if(command.charAt(i) != ' ') {
throw new IllegalArgumentException( );
}
}
double val = outof( );
if(top != null) {
throw new IllegalArgumentException( );
}
return val;
}
private String command;
private StackNode top;
/* main method */
public static void main(String args[]) {
while(true) {
Scanner in = new Scanner(System.in);
System.out.println("Enter RPN expression or \"quit\".");
String line = in.nextLine( );
if(line.equals("quit")) {
break;
} else {
RPN calc = new RPN(line);
System.out.printf("Answer is %f\n", calc.get( ));
}
}
}
}
Step by step
Solved in 3 steps with 4 images