此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<String> rpnStack = new Stack<String>();
//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<String> 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的因素是原因。有什么见解吗?
答案 0 :(得分:5)
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.
答案 1 :(得分:0)
堆栈是LIFO,或“Last in,First out”。因此,当您输入序列为4 5 * 6 -
并执行此操作时:
rpnStack.push(st.nextToken());
你弹出的第一件事是“ - ”,第二件事是“6”,第三件事是“*”。这是你期望的吗?
此外,而不是:
String temp1 = stack.peek();
stack.pop();
你可以这样做:
String temp1 = stack.pop();
答案 2 :(得分:0)
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)