的EmptyStackException
此EmptyStackException继续弹出。 遗憾的是,我的堆栈中没有任何内容,但是用户输入的第一个元素。 但是,我不确定代码在哪里有缺陷。 (很多地方)但我只需要解决这个错误。
import java.util.*; public class stacks2 { public static void main (String []args){ System.out.printf("Enter a math equation in reverse polish notation:\n"); //Create stack of Strings Stack rpnStack = new Stack(); //Create Scanner Scanner input = new Scanner(System.in); //String in = input.next(); while(input != null) { String in = input.next(); // Tokenize string based on spaces. StringTokenizer st = new StringTokenizer(in, " ", true); while (st.hasMoreTokens()) { rpnStack.push(st.nextToken()); } //Send stack to Calculation Method calculate(rpnStack); } } public static void calculate(Stack stack) { // Base case: stack is empty => Error, or finished if (!stack.isEmpty()) // throw new StackUnderflowException("Empty Stack"); // Base case: stack has 1 element, which is the answer => finished if (stack.size() == 1) System.out.printf("Finished, Answer: %s\n",stack.peek()); // Recursive case: stack more elements on it. if (stack.size() > 1){ String temp1 = stack.peek(); stack.pop(); String temp2 = stack.peek(); stack.pop(); String temp3 = stack.peek(); stack.pop(); if (temp3.equals("+")){ float resultant = Float.parseFloat(temp1) + Float.parseFloat(temp2); stack.push(String.valueOf(resultant)); //System.out.println(resultant); calculate(stack); } if (temp3.equals("-")){ float resultant = Float.parseFloat(temp1) - Float.parseFloat(temp2); stack.push(String.valueOf(resultant)); //System.out.println(resultant); calculate(stack); } else if (temp3.equals("*")){ float resultant = Float.parseFloat(temp1) * Float.parseFloat(temp2); stack.push(String.valueOf(resultant)); //System.out.println(resultant); calculate(stack); } else if (temp3.equals("/")){ float resultant = Float.parseFloat(temp1) / Float.parseFloat(temp2); stack.push(String.valueOf(resultant)); //System.out.println(resultant); calculate(stack); } else{ System.out.printf("Something severely has gone wrong."); } } } }
输入和错误:
:~ Home$ java stacks2 Enter a math equation in reverse polish notation: 4 5 * 6 - Finished, Answer: 4 Exception in thread "main" java.util.EmptyStackException at java.util.Stack.peek(Stack.java:85) at stacks2.calculate(stacks2.java:41) at stacks2.main(stacks2.java:22)
很明显,这只是第一个让我觉得我的while循环是17的原因。 任何见解?
String in = input.next();
读一个字,然后你试图标记这个词。 也许你的意思是String in = input.nextLine();
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#next()http://docs.oracle.com/javase/1.5.0/docs/api /java/util/Scanner.html#nextLine()
此外,您的代码中有这两行。
if (!stack.isEmpty()) // throw new StackUnderflowException("Empty Stack");
这是完全错误的。 没有花括号, if
会影响下一个语句。 这不是评论 – 如果是以下是。
这个:
if (!stack.isEmpty()) // throw new StackUnderflowException("Empty Stack"); // Base case: stack has 1 element, which is the answer => finished if (stack.size() == 1) System.out.printf("Finished, Answer: %s\n",stack.peek());
相当于:
if (!stack.isEmpty()) if (stack.size() == 1) System.out.printf("Finished, Answer: %s\n",stack.peek());
和这个:
if (!stack.isEmpty() && stack.size() == 1){ System.out.printf("Finished, Answer: %s\n",stack.peek()); }
道德:总是使用大括号和if
而不是注释掉断言。 即使你做出评论断言,也要完全评论它们,而不是其中的一半,尤其是当另一半是非括号的时候。
第三,你的逻辑是有缺陷的。 你做这个:
将所有符号推送到堆栈,然后弹出前三个并将它们视为运算符和两个数字。 如果您使用队列,这将适用于某些输入。
4 5 * 6 -
根据你的逻辑,这将弹出* 6 -
并崩溃。 如果您使用队列,它将在这种情况下工作
4 5 * 6 - 20 6 - 14
但不是这种情况:
(1+1)*(1+1) express as RPN 1 1 + 1 1 + * 2 1 1 + *
接下来,你弹出2 1 1并崩溃。
相反,你应该做什么:
Read the input. For each symbol: if it is a number, push it on the stack. else, pop two numbers from the stack, perform the operation and push the result.
堆栈是LIFO,或“Last in,First out”。 所以当你有一个4 5 * 6 -
的输入序列4 5 * 6 -
并执行此操作:
rpnStack.push(st.nextToken());
你弹出的第一件事是“ – ”,第二件事是“6”,第三件事是“*”。 这是你期望的吗?
而且,而不是:
String temp1 = stack.peek(); stack.pop();
你可以做:
String temp1 = stack.pop();
import logging, sys, time import jenkins from jenkinsapi.jenkins import Jenkins from jenkinsapi.build import Build from collections import OrderedDict LOGGER = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO)