知道这条线有什么问题吗? outStr[i]=(String) s.pop();
import java.util.ArrayList;
import java.util.Scanner;
public class StringWordReverse {
public String[] StringToWord(){
Scanner sc = new Scanner(System.in);
sc.useDelimiter(" ");
ArrayList<String> wordList= new ArrayList<String>();
String sc_in= sc.nextLine();
String[] sc_split=sc_in.split(" +");
for (int i=0; i<sc_split.length; i++){
wordList.add(sc_split[i]);
}
String[] stringArr= new String[wordList.size()];
for (int i=0; i<wordList.size(); i++){
stringArr[i]= wordList.get(i);
}
return stringArr;
}
public String[] reverseWords(String[] words){
Stack<String> s= new Stack<String>();
String[] outStr=new String[words.length];
for (int i=0; i<words.length; i++){
s.push(words[i]);
}
for (int i=0; i<words.length; i++){
System.out.println(s.stackSize());
outStr[i]=(String) s.pop();
}
return outStr;
}
public static void main(String[] argc){
StringWordReverse swr = new StringWordReverse();
String[] inputWords= swr.StringToWord();
String[] outputWords=swr.reverseWords(inputWords);
for (int i=0; i<outputWords.length;i++)
System.out.println(outputWords[i]);
return;
}
}
这是我的Stack类:
import java.util.ArrayList;
public class Stack<E> {
private ArrayList<E> s = new ArrayList<E>();
private static int size=0;
public void push(E item){
s.add(item);
size++;
return;
}
public E pop(){
size--;
return s.remove(size-1);
}
public int stackSize(){
return size;
}
}
这是我收到的错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:400)
at java.util.ArrayList.remove(ArrayList.java:477)
at XYZ.Stack.pop(Stack.java:16)
at XYZ.StringWordReverse.reverseWords(StringWordReverse.java:35)
at XYZ.StringWordReverse.main(StringWordReverse.java:47)
答案 0 :(得分:2)
此代码中的一些错误信息:
您使用原始类型而不是泛型。让编译器帮助您(大多数)运行时类型错误:Stack<String> stack = new Stack<>()
在Stack.pop
中,您永远不会检查是否有要弹出的元素。如果堆栈为空,您应该对其进行测试并抛出异常,例如NoSuchElementException
。
Stack.pop
中,您正在递减大小,然后删除项size - 1
,因此基本上减少了两次。这应该是:s.remove(--size);
答案 1 :(得分:1)
您正在减小尺寸变量之前使用相同尺寸的变量从堆叠中取出项目。因此,当您使用剩下的一个项目调用pop时,将大小减小为0,然后尝试删除位置-1处的项目。
为什么在列表中已经有一个变量来维护自己的大小变量?
答案 2 :(得分:1)
尝试更改代码的这一部分:
public E pop(){
size--;
return s.remove(size-1);
}
到此:
public E pop(){
return s.remove(size--);
}
这就是错误。