Stack Adding Machine doesn’t add but hangs waiting for more args Code Answer

Hello Developer, Hope you guys are doing great. Today at Tutorial Guruji Official website, we are sharing the answer of Stack Adding Machine doesn’t add but hangs waiting for more args without wasting too much if your time.

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
We are here to answer your question about Stack Adding Machine doesn’t add but hangs waiting for more args - If you find the proper solution, please don't forgot to share this with your team members.

Related Posts

Tutorial Guruji