!("(")。equals(stack.peek())无法正常工作

时间:2018-03-18 17:25:16

标签: java stack

最近我一直在通过在java中实现堆栈来创建计算器。我在代码中遇到了stack.peek().equals("(")的问题,我尝试了几种不同的方法来解决这个问题,但似乎没什么用。

以下是我的代码:

import java.util.Scanner;
import java.util.Stack;
public class URCalculator {

    public static Scanner scan = new Scanner(System.in);
    public static Stack<String> uRStack = new Stack<String>();
    public static Stack<String> uROPStack = new Stack<String>();

    public static void main(String[] args) {
        prompt();
        String val = scan.next();

        pusher(splitInput(val));
        while(!uRStack.empty()) {
            System.out.println(uRStack.pop());
        }
    }
    public static String[] splitInput(String val) {
        return val.split("(?!^)");
    }

    public static void pusher(String[] s) {
        int counter = 0; // counter determines if there is a numeric value     
in the index prior, if so then we concatenate and add back to the stack.
        for(int i=0; i<s.length; i++) { // loops through split input array 
            if(isNumeric(s[i]) && counter != 0) { // checks if number and if 
previous number 
                pushNumeric(uRStack.pop() + s[i]);
                counter++;
            }
            else if (isNumeric(s[i])) { // checks if just a number
                pushNumeric(s[i]);
                counter++;
            }
            else if(isOperator(s[i])) { // if not number  then reset counter for latter values
                addOperator(s[i]);
                counter=0;
            }           
        }
        uRStack.push(uROPStack.pop());

     }
    public static void addOperator(String s) { // uses cases to determine logic for operator stack
    switch(s) {
    case "+": 

        if(!uROPStack.empty()){
            while(!"(".equals(uROPStack.peek()) && !uROPStack.empty()) { // while operators not of lower precedence then push pop
                uRStack.push(uROPStack.pop());
            }
        }
        uROPStack.push(s);
        break;

    case "-":

        if(!uROPStack.empty()){
            while(!"(".equals(uROPStack.peek()) && !uROPStack.empty()) { // while operators not of lower precedence then push pop
                uRStack.push(uROPStack.pop());
            }
        }
        uROPStack.push(s);
        break;

    case "*":

        if(!uROPStack.empty()) {
            while("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek())) { // while operators of equal or greater precedence then push pop
                uRStack.push(uROPStack.pop());
            }
        }
        uROPStack.push(s);
        break;

    case "/":

        if(!uROPStack.empty()) {
            while("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek())) { // while operators of equal or greater precedenc then push pop
                uRStack.push(uROPStack.pop());
            }
        }
        uROPStack.push(s);
        break;

    case "(":

        uROPStack.push(s);
        break;

    case ")":
        if(!uROPStack.empty()){
            while(!"(".equals(uROPStack.peek())) {
                uRStack.push(uROPStack.pop());
            }
        }
        break;

    }

}

我已经为上下文添加了main和pusher方法,但真正的问题在于addOperation方法,特别是while循环中的第一个boolean。我得到的错误发布在下面:

    Hello and welcome to the URCalculator. Please type an operation
    1-2-3-4-5
    Exception in thread "main" java.util.EmptyStackException
    at java.util.Stack.peek(Unknown Source)
    at URCalculator.addOperator(URCalculator.java:129)
    at URCalculator.pusher(URCalculator.java:107)
    at URCalculator.main(URCalculator.java:14)

我理解我的代码并不是最优雅的代码,也没有完成,但我似乎无法理解为什么我会收到我得到的错误。我检查的一件事是当我删除!"(".equals(uROPStack.peek())时 从表达式来看,事情似乎顺利进行。问题是我仍然需要处理我的堆栈中的paranthetical案例,所以我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

这种情况被破坏了:

!"(".equals(uROPStack.peek()) && !uROPStack.empty()

如果uROPStack为空,则uROPStack.peek()会抛出EmptyStackException

如果您翻转条件,它将按预期工作:

!uROPStack.empty() && !"(".equals(uROPStack.peek())

这里,由于&&运算符的短路行为, 如果第一个条件为假(=堆栈为空), 那么第二个条件(.peek())将不会被执行, 并且你得到了理想的行为。

你没有问过这个问题,但另一个问题是等待在这里爆炸:

if(!uROPStack.empty()) {
    while("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek())) { 
        uRStack.push(uROPStack.pop());
    }
}

也就是说,因为uROPStack.pop()循环体中的while, 循环条件中的uROPStack.peek()可能会导致EmptyStackException。您需要确保循环条件中堆栈不为空:

while(!uROPStack.peek().isEmpty() && ("*".equals(uROPStack.peek()) || !"/".equals(uROPStack.peek()))) {