堆栈添加计算机不添加但挂起等待更多args

所以我有一个我建立的堆栈,我有一台机器来评估表达式,如(9 + 0),它们可能更复杂。 我在命令行上运行它很有趣,然后当我键入示例(9 + 5)时,程序就在那里。 我可以得到一个新的行,但表达式没有评估。 所以我的问题是我错过了什么。 我确信有些东西我没有正确理解,我认为我遗漏了一些有关Scanner或Java中的数组的信息。

也许我昨​​晚想到我应该用ArrayList替换数组。 这有意义吗?

这是固定容量堆栈

public class FCStack { 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; } 

}

这是两个堆栈评估器

 import java.io.*; import java.util.Scanner; public class TwoStackMaths { public static void main (String[] args) { FCStack ops = new FCStack(10); FCStack vals = new FCStack(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()); } 

}

你的代码对我有用; 我确实改变了它以使用ArrayList,我添加了这样的peek

 import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class FCStack { public static void main(String[] args) { FCStack ops = new FCStack(10); FCStack vals = new FCStack(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 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(); 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; } } 

经过测试如此

 ( 12.0 * 3.0 ) . 36.0