The question is published on by Tutorial Guruji team.
so I have a Stack that I built and I have a Machine to evalute expressions like, ( 9 + 0 ) and they can be more complex. I run it fun the commandline and then when I type the example ( 9 + 5 ) the program just sits there. I can get a new line but the expression doesn’t evaluate. So My question is what did I miss. I am sure there is something that I haven’t understood correctly and I was thinking that I am missing something about the Scanner or about arrays in Java in general.
Perhaps I was thinking last night that I should replace arrays with ArrayList. Does this make sense?
Here is the Fixed Capacity Stack
public class FCStack<Item> { private Item[] a; private int top; // pointer to top of Stack private int capacity; // size of the Stack+1 public FCStack(int cap){ capacity = cap; a = (Item[]) new Object[capacity]; top = 0; } public void push(Item i){ //will only push an Item to the Stack if there is room. if (!isFull()) { a[top++] = i; } } public Item pop(){ //will only pop an Item from the stack if there is something to pop. if (!isEmpty()) { --top; } return a[top]; } public boolean isFull(){ //returns true if is full return top == capacity; } public boolean isEmpty(){ //returns true if is empty return top == 0; } public int size(){ //returns the current size of the stack+1 or the array index return top; }
}
Here is the two stack Evaluator
import java.io.*; import java.util.Scanner; public class TwoStackMaths { public static void main (String[] args) { FCStack<String> ops = new FCStack<String>(10); FCStack<Double> vals = new FCStack<Double>(10); Scanner console = new Scanner(System.in); while(console.hasNext()) { String str = console.next(); if (str.equals("(")) ; else if (str.equals("+")) { ops.push(str); } else if (str.equals("-")) { ops.push(str); } else if (str.equals("*")) { ops.push(str); } else if (str.equals("/")) { ops.push(str); } else if (str.equals("^")) { ops.push(str); } else if (str.equals(")")) { String op = ops.pop(); double v = vals.pop(); if (op.equals("+")) { v = vals.pop() + v; } else if (op.equals("-")) { v = vals.pop() - v; } else if (op.equals("*")) { v = vals.pop() * v; } else if (op.equals("/")) { v = vals.pop() / v; } else if (op.equals("^")) { v = Math.pow(v, vals.pop()); } vals.push(v); } else { vals.push(Double.parseDouble(str)); } } //console.close(); System.out.println(vals.pop()); }
}
Answer
Your code worked for me; I did change it to use an ArrayList, and I added a peek
like this
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class FCStack<T> { public static void main(String[] args) { FCStack<String> ops = new FCStack<String>(10); FCStack<Double> vals = new FCStack<Double>(10); Scanner console = new Scanner(System.in); try { while (console.hasNext()) { String str = console.next().trim(); if (str.equals(".")) { System.out.println(vals.peek()); } else if (str.equals("(")) { ; } else if (str.equals("+")) { ops.push(str); } else if (str.equals("-")) { ops.push(str); } else if (str.equals("*")) { ops.push(str); } else if (str.equals("/")) { ops.push(str); } else if (str.equals("^")) { ops.push(str); } else if (str.equals(")")) { String op = ops.pop(); double v = vals.pop(); if (op.equals("+")) { v = vals.pop() + v; } else if (op.equals("-")) { v = vals.pop() - v; } else if (op.equals("*")) { v = vals.pop() * v; } else if (op.equals("/")) { v = vals.pop() / v; } else if (op.equals("^")) { v = Math.pow(v, vals.pop()); } vals.push(v); } else { vals.push(Double.parseDouble(str)); } } } finally { console.close(); } } private List<T> a; private int top; // pointer to top of FCStack private int capacity; // size of the FCStack+1 public FCStack(int cap) { capacity = cap; a = new ArrayList<T>(); top = 0; } public void push(T i) { // will only push an Item to // the FCStack if there is room. if (!isFull()) { a.add(i); ++top; } } public T pop() { // will only pop an Item from the // stack if there is something to pop. if (!isEmpty()) { return a.remove(--top); } return null; } public T peek() { if (!isEmpty()) { return a.get(top - 1); } return null; } public boolean isFull() { // returns true if is full return top > capacity; } public boolean isEmpty() { // returns true if is empty return top == 0; } public int size() { // returns the current size of the // stack+1 or the array index return top; } }
Tested like so
( 12.0 * 3.0 ) . 36.0