【问题标题】:Stack Pop loop does not pop all elementsStack Pop 循环不会弹出所有元素
【发布时间】:2013-12-31 16:09:49
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    使用 int i=1 而不是 i=0。例如(int i=1;i&lt;=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());
    
      }
    
     } 
      }
    

    【讨论】:

      【解决方案2】:

      这是一个常见问题。这是一个很好的机会,让您首先学习如何使用调试器,其次学习如何逻辑地思考编程问题。

          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)完全删除计数器,因为它是不必要的;相反,在大小大于零时循环。我更喜欢后一种解决方案;变异的变量越少,变异它们的错误就越少。

      【讨论】:

      • 清晰、简洁,非常感谢。我将不得不习惯使用调试器。我想我也会选择后一种选择。对于任何尺寸缩小的动态数组来说,这似乎是更好的选择?将 For 循环更改为 While 循环后,一切正常。删除最后一个元素后似乎出现错误,但我会弄清楚如何处理它。再次,非常感谢。
      【解决方案3】:

      这可能与您的评估表达式 (i

      啊,被 Eric Lippert 打败了。我向您致敬,先生! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-03-15
        相关资源
        最近更新 更多