代码之家  ›  专栏  ›  技术社区  ›  Carmen Ferrone

哦!(“(”)。equals(stack.peek())工作不正常

  •  -1
  • Carmen Ferrone  · 技术社区  · 7 年前

    最近,我一直在通过在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循环中的第一个布尔值。我收到的错误发布在下面:

        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()) 从整体上看,事情似乎进展顺利。问题是我仍然需要处理堆栈中的偏执案例,所以我不知道该怎么办。

    1 回复  |  直到 7 年前
        1
  •  1
  •   janos slartidan    7 年前

    此条件被破坏:

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

    如果 uROPStack 是空的,那么 uROPStack.peek() 将抛出 EmptyStackException

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

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

    在这里,由于 && 操作人员 如果第一个条件为false(=堆栈为空), 然后是第二个条件( .peek() )不会执行, 你会得到想要的行为。


    你没有问过,但另一个问题也在这里爆发:

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

    也就是说,既然你 uROPStack.pop() while 环 这个 uROPStack。peek() 环路中的情况可能导致 清空堆栈异常 . 您需要确保堆栈在循环条件下不为空:

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