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

0 java queue stack exception-handling 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);
}
Run Code Online (Sandbox Code Playgroud)

代码旨在根据用户输入循环并填充空堆栈,然后循环遍历堆栈并在提示时删除每个元素.我输入的第一组是:

[艺术,蝙蝠,猫,码头,眼睛,父亲]

第二组是:

[艺术,蝙蝠,猫,码头,眼睛,父亲,孩子]

我注意到无论我输入多少元素,它最多只能删除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());
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 11

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

    for(int i = 0; i<sStack.size()+1;i++){
        remS(sStack);
    }
Run Code Online (Sandbox Code Playgroud)

这总是会删除堆栈中的一半项目.通过模拟纸上循环的操作来解决原因,您将很快看到原因.

我的意思的例子.记下:

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...
Run Code Online (Sandbox Code Playgroud)

完成它.


好了,既然您已经了解了问题,那么您将如何解决它?执行此操作的两种标准方法是:(1)首先计数,将结果保存在本地,针对本地进行测试,以及(2)完全删除计数器,因为这是不必要的; 相反,当大小大于零时循环.我更喜欢后一种解决方案; 你变异的变量越少,你在变异中犯的错误就越少.