我正在练习Try-Catch,异常处理,堆栈和队列,所以虽然代码可能不切实际,但对我的练习很有用。
public class Practice {
public static void main(String args[]){
Stack<String> sStack = new Stack<String>();
Queue<String> sQueue = new LinkedList<String>();
Scanner input = new Scanner(System.in);
String inString = " ";
boolean done = false;
do{
try{
while(!inString.equals("")){
System.out.println("Enter a string: ");
inString = input.nextLine().toString();
addS(sStack,inString);
}
done = true;
}catch(Exception e){}
sStack.pop();
for(int i = 0; i<sStack.size()+1;i++){
remS(sStack);
}
}while(done == false);
}
代码旨在根据用户输入循环并填充空堆栈,然后循环遍历堆栈并在提示时删除每个元素。我输入的第一组是:
[艺术,蝙蝠,猫,码头,眼睛,父亲]
第二组是:
[艺术,蝙蝠,猫,码头,眼睛,父亲,孩子]
我注意到无论我输入多少元素,它最多只能删除4个元素。我想帮助你搞清楚原因。正如你所看到的,我试着玩循环的界限,但无济于事。无论我在哪里开始或绑定,它总是最终只能弹出4个元素。
我在下面提供的addS和remS函数
public static void addS(Stack t, String s){
t.push(s);
System.out.printf("%s was added to the stack %s", s, t);
System.out.println();
}
public static void remS(Stack t){
System.out.printf("\n%s has been popped.",t);
t.pop();
System.out.printf("The current elements are now: ");
System.out.print(t);
System.out.printf("The next element to be popped is %s", t.peek());
}
答案 0 :(得分:11)
这是一个经常被问到的问题。这是您首先学习如何使用调试器的好机会,其次,学习如何逻辑地思考编程问题。
for(int i = 0; i<sStack.size()+1;i++){
remS(sStack);
}
这总是删除堆栈中的一半项目。通过模拟循环在纸上的操作来找出原因,您将很快看到原因。
我的意思的例子。记下:
stack contains A, B, C, D
i is 0
test loop condition: 0 is smaller than 4 + 1, so we enter the loop.
remove item from stack.
stack contains B, C, D
size is 3
execute loop increment: i is now 1
test loop condition: 1 is smaller than 3 + 1, so we enter the loop...
完成它。
好的,既然您已了解问题,那么您将如何修复它?执行此操作的两种标准方法是:(1)首先计数,将结果保存在本地,针对本地进行测试,以及(2)完全删除计数器,因为这是不必要的;相反,当大小大于零时循环。我更喜欢后一种解决方案;你变异的变量越少,你在改变它们时所犯的错误就越少。
答案 1 :(得分:0)
这可能与您的评估表达式(i&lt; sStack.size()+ 1)在每次迭代中都有效的事实有关。你的筹码每次都会收缩,而且我的筹码量很大。每次递增。您可能希望将堆栈的大小保存在变量中并与之比较。
啊,除了Eric Lippert之外别无他法。先生,我向你致敬! :)答案 2 :(得分:0)
使用i=1
的int i=0
intead。例如(int i=1;i<=n;i++)
。
import java.io.*;
import java.util.*;
public class Rev
{
public static void main(String args[]) throws IOException
{
Stack<String> v=new Stack<String>();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
String[] arr=new String[n];
//String str=br.readLine();
for(int i=0;i<n;i++)
{
arr[i]=br.readLine();
}
System.out.println("entered data is");
for(int i=0;i<n;i++)
{
System.out.println(arr[i]);
}
for(int i=0;i<n;i++)
{
v.push(arr[i]);
}
System.out.println("getting the element");
System.out.println(v.get(1));
v.set(1,"15");
System.out.println(v.get(1));
System.out.println("reversed String is");
for(int i=1;i<=n;i++)
{
System.out.println(v.pop());
}
}
}