Java 我想创建一个方法来删除堆栈中另一个给定堆栈中的所有元素

Java 我想创建一个方法来删除堆栈中另一个给定堆栈中的所有元素,java,linked-list,integer,stack,Java,Linked List,Integer,Stack,我正在学习堆栈,我想实现上面提到的方法。 我一直在努力,这是我到现在为止的进步 public void deleteEqualToOther(Stack s) { Stack s1 = new Stack(); Stack s2 = new Stack(); while(!this.isEmpty() && !s.isEmpty()) { if(this.stackTop() !=

我正在学习堆栈,我想实现上面提到的方法。 我一直在努力,这是我到现在为止的进步

    public void deleteEqualToOther(Stack s) {
        Stack s1 = new Stack();
        Stack s2 = new Stack();
        
        while(!this.isEmpty() && !s.isEmpty()) {
            if(this.stackTop() != s.stackTop()) {
                s1.push(this.stackTop());
            }   s2.push(s.stackTop());
            this.pop();
            s.pop();
        }
        
        while(!s1.isEmpty()) {
            this.push(s1.stackTop());
            s1.pop();
            
        }
        
    }

   public static void display(Stack s) {
        Stack s1 = new Stack();
        
        if(s.isEmpty()) {
            System.out.println("the stack is empty");
            return;
        }
        
        while(!s.isEmpty()) {
            
            s1.push(s.stackTop());
            s.pop();
            System.out.println(s1.stackTop());
        }
        
        while(!s1.isEmpty()) {
            s.push(s1.stackTop());
            s1.pop();
        }
        
    }
我的堆栈是使用单链接实现的。
我的逻辑是,我在名为
s1
的新堆栈中弹出
this
堆栈的所有元素,并在新堆栈
s2
中弹出
s
的所有元素,同时,我将比较每个堆栈的
stackTop()
并删除相等的元素

这是我的主要观点:

        Stack s1 = new Stack();
        Stack s2 = new Stack();
        
        s1.push(1);
        s1.push(2);
        s1.push(2);
        s1.push(4);
        s1.push(-5);
        display(s1);
        System.out.println("______________________");
        
        s2.push(2);
        s2.push(3);
        s2.push(4);
        s2.push(6);
        s2.push(7);
        display(s2);
        System.out.println("______________________");

        s1.deleteEqualToOther(s2);
        display(s1);
        
        
    }

但是我得到的结果是初始堆栈。

在当前的实现中,您将堆栈1的第一个元素与堆栈2的第一个元素进行比较,然后再与第二个元素进行比较,以此类推。这只会导致在两个堆栈中的相同索引处删除相同的元素。要解决这个问题,可以对第一个堆栈的每个值进行循环,查看第二个堆栈中是否存在该值,如果存在,则将其从第一个堆栈中移除。这看起来像是一项教育任务,所以我建议你仔细考虑这个想法。如果您最终陷入困境,我可以提供伪代码或回答问题。

您可以使用
Collection1.removeAll(Collection2)
内置方法来完成此操作。此方法将Collection2中存在的所有元素从Collection1中移除,在您的案例中,这是一个堆栈

Stack<String> strs1 = new Stack<>();
    strs1.push("a");
    strs1.push("b");
    strs1.push("c");
    Stack<String> strs2 = new Stack<>();
    strs2.push("c");
    strs2.push("d");
    strs2.push("e");
    strs1.removeAll(strs2); // the result: strs1 = [a, b]
Stack strs1=新堆栈();
strs1.推送(“a”);
strs1.推送(“b”);
strs1.推动(“c”);
堆栈strs2=新堆栈();
strs2.推动(“c”);
strs2.推动(“d”);
strs2.推动(“e”);
strs1.拆除所有(strs2);//结果:strs1=[a,b]

我想制作一个方法来删除堆栈中与另一个给定堆栈相等的所有元素
您的意思是删除堆栈中也在另一个堆栈中的所有元素吗?也就是说,你是在看第一个堆栈减去与另一个堆栈的重叠吗?@Pieter12345应该做的是将初始堆栈的元素与另一个给定堆栈的元素作为参数进行比较。应该从初始堆栈中删除相等的元素。此处使用的
堆栈
不是
java.util.stack
,因为这可能是一个教育练习。这个功能确实是由API提供的,但我认为这里不允许他们使用它。虽然你的答案大体上很好。我很感激,但我还没有学会泛型,所以我不知道它是如何工作的。我的错,我想正如@Pieter12345所提到的,您需要另一个嵌套循环来迭代第二个堆栈中的所有元素,以获得结果堆栈中的每个元素并删除重复项。这是否意味着我应该在第一个循环中有一个循环?是的,因为您希望检查第一个堆栈中的每个元素与第二个堆栈中的每个元素。有更有效的方法使用散列,但我认为这不是你现在正在寻找的。我可以有更多的提示吗?你需要在一个堆栈上循环。在该循环中,您需要在另一个堆栈上循环,并比较两个堆栈的元素。如果它们相等,则从第一个堆栈中删除元素。这将使您的第一个堆栈中没有第二个堆栈中的所有元素。您好,我在执行此操作时仍有问题,可以给我答案吗?