我要做的是获取eval变量,将每个字母放入堆栈然后打印出来。我收到一个EmptyStackException错误(假设这表示堆栈中没有任何内容)。我不明白的是我认为eval字符串被放入变量堆栈。为什么它是空的?
public static void main(String[] args)
{
Stack<String> variable = new Stack<String>();
String eval = StdIn.readString();
String alphabet = "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i = 0; i < eval.length(); i++)
{
eval = eval.substring(i,i);
if (eval.equals(alphabet.substring(0, 52)))// checks if eval is equal to any letter of alphabet
{
variable.push(eval);
System.out.println(variable.pop());
}
}
}
}
我正在使用eclipse
示例运行:
input: hello
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at java.util.Stack.pop(Unknown Source)
at eval.main(eval.java:31)
答案 0 :(得分:4)
获得此错误的唯一方法是:
for (int i = 0; i < eval.length(); i++)
{
eval = eval.substring(i,i);
if (eval.equals(alphabet.substring(0, 52)))
{
variable.push(eval);
}
System.out.println(variable.pop());
}
如果你有System.out.println(variable.pop());
在if条件之外。
<强> pop 强>
public Object pop()
移除此堆栈顶部的对象并将该对象返回为 这个函数的价值。
返回:此堆栈顶部的对象(最后一项) 矢量对象)。抛出:
EmptyStackException - 如果此堆栈为空。
在您发布的代码中,由于您具有相同数量的push
和pop
,因此push
操作优先于pop
。< / p>
您提供的代码:
您遇到的错误:
答案 1 :(得分:3)
我可以看到一些问题:
eval.substring(i,i);
每次都会返回一个空字符串。您需要eval.substring(i,i + 1);
,甚至更好,eval.charAt(i);
。
您需要将返回的substring / charAt字符放在for
循环中的变量中。目前,它在第一次迭代后覆盖eval
字符串。
if (eval.equals(alphabet.substring(0, 52)))
并没有按照您的评论判断出您的想法。如果要检查字符串是否包含其他字符串(或者甚至只包含单个字符),请使用以下方法:String#contains
或String#indexOf
。
这是一个简单的纠正片段:
String alphabet = "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
String eval = "blah";
Stack<Character> chars = new Stack<Character>();
for(char c : eval.toCharArray()) {
if(alphabet.indexOf(c) != -1) {
chars.push(c);
System.out.println(chars.pop());
}
}
答案 2 :(得分:2)
您需要检查eval
中的每个字母是否都是一个字母,然后再将其推入堆栈。在浏览eval
中的所有字符后,将所有字符从堆栈中弹出并打印出来。
for(int i = 0; i < eval.length(); i++) {
if(alphabet.contains(eval.charAt(i))) {
variable.push(eval.charAt(i));
}
}
while(!variable.isEmpty()) {
System.out.println(variable.pop());
}
答案 3 :(得分:1)
这可以解决您的问题: 你应该只是在你推后弹出。因此,它们都应该在if语句中。
for (int i = 0; i < eval.length(); i++)
{
if (alphabet.contains(eval.substring(i,i+1))
{
variable.push(eval.substring(i,i+1));
System.out.println(variable.pop());
}
}
答案 4 :(得分:0)
您想检查从输入读取的字符串中的字符是否为字母,并将它们放在stac中
您应该考虑使用Character class,它允许您对字符执行所有类型的测试,而不必担心编码。在您的情况下可能有用的方法是isLetter
,它检查字符是否为字母。
至于堆栈问题,你的代码实际上在堆栈顶部推送一个值,然后立即pop
它,这解释了为什么你的堆栈在循环结束时是空的。您应该使用peek
方法。