在stackoverflow和其他论坛中寻找解决方案一小时后,我放弃了。
你知道我为什么会得到例外吗?
public Stack<Character> einlesen(){
Scanner sc = new Scanner(System.in);
Stack<Character> st = new Stack<>();
System.out.println("Please insert any random text: \n");
DataInputStream is = new DataInputStream(System.in);
try {
String eingabe;
eingabe = is.readLine();
int i = 0;
while (eingabe.charAt(i) != -1 ) {
st.push(eingabe.charAt(i));
i++;
}
} catch (IOException e) {
e.printStackTrace();
}
return st;
编辑:
感谢Elliot的完美工作。
如果我想以相反的顺序重写堆栈中的所有字符,我尝试使用以下代码。但它只写了几个字。当我使用peek函数时,它给了我所有这些。
所以我觉得“我有点错误”
for ( int i =0; i<st.size();i++) {
System.out.print(st.pop().toString());
}
答案 0 :(得分:2)
你知道我为什么会得到例外吗?
是啊......
您的eingabe
字符串不可能包含等于-1
的字符。 (即使字符0xffff
将转换为整数65535
。)所以你的while循环只是索引字符串的结尾。
(无论如何,Java字符串都不会被任何特定字符终止。Java ain C = C ++。)
使用eingabe.length()
告诉您何时停止...
在stackoverflow和其他论坛中寻找解决方案一小时后,我放弃了。
这里有一些免费的建议:
您正在做的不是解决程序问题的正确方法。正确的编程方法是根据您对Java语言和类库的了解来阅读和理解您的代码。如果你还没有这方面的知识......
执行Oracle Java教程,或购买和阅读优秀的初学者Java教科书。
阅读您尝试使用的类的javadoc。
答案 1 :(得分:1)
你需要使用for循环。
String eingabe;
eingabe = is.readLine();
for( int i = 0; i < eingabe.length(); i++ ) {
st.push(eingabe.charAt(i));
}
答案 2 :(得分:1)
Java不是C
(即使它是-1,也不是'\ 0'),这个
while (eingabe.charAt(i) != -1 ) {
st.push(eingabe.charAt(i));
i++;
}
应该是
while (i < eingabe.length()) {
st.push(eingabe.charAt(i));
i++;
}
,或者
for (char ch : eingabe.toCharArray()) {
st.push(ch);
}
因为Java String
没有String
字符的结尾。
答案 3 :(得分:1)
对于charAt
,索引i必须介于0和字符串长度减1(包括两端)之间。当i等于length()时,您会得到索引超出约束的异常。
这是the document for String charAt。
以下是解决此问题的一种方法:
while (i < eingabe.length()) {
....
}
答案 4 :(得分:0)
这是你的第二个问题的答案: 是的,问题出在for循环中,用于从堆栈中检索元素。您不应该操纵数据结构,尤其是在根据大小进行迭代时。 for循环中的代码片段从堆栈中删除一个元素(这意味着大小减少了1)并且循环变量增加1.这就是为什么只获得一半数据的原因。 / p>
我希望下面的代码能够提供帮助。
Stack<Character> stack = new Stack<Character>();
String name = "Loganathan";
for (char c : name.toCharArray()) {
stack.push(c);
}
StringBuffer buff = new StringBuffer();
while (! stack.isEmpty()) {
buff.append(stack.pop());
}
System.out.println("Retrieved from the stack : " + buff.toString());