Stack Pop循环不会弹出所有元素

时间:2013-12-13 00:47:56

标签: java exception-handling stack queue try-catch

我正在练习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());
}

3 个答案:

答案 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());

  }

 } 
  }