当前位置: 首页 > 知识库问答 >
问题:

如何检查两个给定堆栈是否具有相同的值?(顺序不一定相同)

霍浩皛
2023-03-14

每个人如何检查两个堆栈是否具有相同的值?

例如,在stack1中我有[1,3,4,5],在stack2中我有[4,3,1,5],因此堆栈具有相同的值,并且Method需要返回true。

此外,堆栈必须(最终)与给定的堆栈相同(具有原始值和相同的顺序)。

我已经开始做了,但不幸的是,效果不好:

import java.util.Stack;
public class StackMain {
    public static void main(String[] args) {
        
        Stack<Integer> st1 = new Stack<Integer>();
        st1.push(2);
        st1.push(643);
        st1.push(254);
        st1.push(13);
        st1.push(74);
        st1.push(6);
        st1.push(5);
        st1.push(99);
        
        Stack<Integer> st2 = new Stack<Integer>();
        st2.push(643);
        st2.push(2);
        st2.push(254);
        st2.push(13);
        st2.push(99);
        st2.push(5);
        st2.push(6);
        st2.push(74);
        System.out.println(isSameStacks(st1,st2));
    }
    public static boolean isSameStacks(Stack st1, Stack st2)
    {
        Stack st1Reverse = new Stack();
        Stack st2Reverse = new Stack();
        boolean isExist = false;
        while(st1.isEmpty()==false)
        {
            isExist = false;
            st1Reverse.push(st1.pop());
            while(st2.isEmpty()==false)
            {
                st2Reverse.push(st2.pop());
                if(st1Reverse.peek()== st2Reverse.peek())
                    isExist  = true;
            }
            while(st2Reverse.isEmpty()==false)
                st2.push(st2Reverse.pop());
            if(isExist!=true)
            {
                while(st1Reverse.isEmpty()==false)
                    st1.push(st1Reverse.pop());
                return false;
            }
        }
        while(st1Reverse.isEmpty()==false)
            st1.push(st1Reverse.pop());
        return true;
    }

提前谢谢。

共有3个答案

暴向笛
2023-03-14

更新:正如@lzruo所提到的,如果堆栈有重复的元素,这将不起作用。假设stack1有[1,1,2],stack2有[1,2],这将返回true。

初始答案:由于JavaStack是一个Vector,它是一个Collection(特别是一个List),我们可以从堆栈中迭代或创建一个流并将其收集到ASetHashSet)。这不会影响堆栈中的元素(不会被删除)。

或者简单地说,由于HashSet构造函数按照我们的喜好接受集合

Set<Integer> stack1AsSet = new HashSet<>(st1);
Set<Integer> stack2AsSet = new HashSet<>(st2);

System.out.println(stack1AsSet.equals(stack2AsSet)); //prints true

堆栈顺序或元素不会受到影响。

System.out.println(st1.pop()); //prints 99

@c0der的答案更简单。但如果使用哈希集,则可以在检查集内容之前检查堆栈大小是否相等。

return st1.size() == st1.size() &&  new HashSet<>(st1).equals(new HashSet<>(st2));
陆才俊
2023-03-14

我们可以使用Hashmap跟踪每个堆栈中的元素计数,并使用它们检查两个堆栈是否相同

import java.util.*;
public class HelloWorld {
    public static void main(String[] args) {
        
        Stack<Integer> st1 = new Stack<Integer>();
        st1.push(2);
        st1.push(643);
        st1.push(254);
        st1.push(13);
        st1.push(74);
        st1.push(6);
        st1.push(5);
        st1.push(99);
        
        Stack<Integer> st2 = new Stack<Integer>();
        st2.push(643);
        st2.push(2);
        st2.push(254);
        st2.push(13);
        st2.push(99);
        st2.push(5);
        st2.push(6);
        st2.push(74);
        System.out.println("Is Same STack: " + isSameStacks(st1,st2));
    }
    public static boolean isSameStacks(Stack<Integer> st1, Stack<Integer> st2)
    {
        Stack<Integer> st1Reverse = new Stack<Integer>();
        Stack<Integer> st2Reverse = new Stack<Integer>();
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        boolean isExist = false;
        while(st1.isEmpty()==false)
        {
            isExist = false;
            Integer val = st1.pop();
            Integer val2 = st2.pop();
            st1Reverse.push(val);
            st2Reverse.push(val2);
            if(map.get(val) == null) {
                map.put(val, 0);
            }
            if(map.get(val2) == null) {
                map.put(val2, 0);
            }
            map.put(val, map.get(val) + 1);
            map.put(val2, map.get(val2) + 1);
        }
        boolean res = true;
        Integer tmp;
        while(st1Reverse.isEmpty()==false) {
            tmp = st1Reverse.pop();
            if(map.get(tmp)%2 != 0) {
                res = false;
            }
            st1.push(tmp);
        }
        while(st2Reverse.isEmpty()==false) {
            tmp = st2Reverse.pop();
            if(map.get(tmp)%2 != 0) {
                res = false;
            }
            st2.push(tmp);
        }
        return res;
    }
}
米浩穰
2023-03-14

一种简单的方法是使用Collection功能:

   public static boolean isSameStacks(Stack st1, Stack st2)   {
        if(st1.size() != st1.size()) return false;
        List list = new ArrayList<>(st1);//add all st1 elements 
        list.removeAll(st2);//remove all st2 elements 
        return list.size() == 0;
   }

为了完整起见,这里是另一个使用Collection功能的解决方案。它基于@user7发布的部分解决方案:

  public static boolean isSameStacks(Stack st1, Stack st2)   {
       return st1.size() == st1.size() &&  
                    new HashSet<>(st1).equals(new HashSet<>(st2)); 
   }
 类似资料:
  • 如何检查两个数组(循环)是否具有相同顺序的相同元素。例如,让我们以数组[1,2,3,4]为例。 对于[2,3,4,1]、[3,4,1,2]、[4,1,2,3],测试应返回true,但对于[1,3,2,4]、[1,4,2,3]或[1,2,3,5]则不返回true。 我最初的方法是找到第一个匹配项——每个数组中一个相等的元素——并将这两个元素视为各自数组的初始元素,我逐个比较了数组的其余元素。 有没有

  • "给定两个字符串s和t,编写一个函数来检查s是否包含t的所有字符(顺序与字符串t相同)。返回true或false。递归不一定。这是我用java写的代码片段。问题是输入: string1="st3h5irteuyarh!"和string2="shrey"它应该返回TRUE,但它返回FALSE。那是为什么?"

  • 问题内容: 我有两个数组:一个数组填充了来自ajax请求的信息,另一个数组存储了用户单击的按钮。我使用以下代码(我填写了示例编号): 但是,即使两个数组相同,但名称不同,它总是给出。(我在Chrome的JS控制台中对此进行了检查)。那么,有什么办法可以知道这两个数组是否包含相同的数组?为什么给?我怎么知道第一个数组中的哪个值不在第二个数组中? 问题答案: 请注意,这不会像以前的答案那样修改原始数组

  • 我有两个arraylist。employee类和user类的ArrayList。employee类将name、age、address作为字段。用户类将名称、年龄、地址作为字段。下面是两个列表 要检查用户是否和员工的地址相同。如果用户没有地址,则从员工处复制。

  • 我想比较两个数组,看看它们是否有相同的值。 如果我有一个数组,名为 以及如何将坐标放入“coords”变量(哦,等等,它被称为“ship”,而不是coords。我忘了): //arr.add(new javax.vecmath.vector3f(float.parsefloat(x),float.parsefloat(y),float.parsefloat(z));}谢谢!

  • 问题内容: 我知道我可以在Swift中检查var的类型 但是如何检查两个实例具有相同的类?以下内容不起作用: 我可以轻松地添加一个“类”函数,并在每个子类中对其进行更新,以返回唯一的内容,但这似乎有点麻烦。 问题答案: 我觉得有必要首先引用 Swift编程语言 文档: 类具有 结构没有的 其他功能: 通过类型转换,您可以在运行时检查和解释类实例的类型。 因此,这对将来的某人可能会有所帮助: 和测试