每个人如何检查两个堆栈是否具有相同的值?
例如,在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;
}
提前谢谢。
更新:正如@lzruo所提到的,如果堆栈有重复的元素,这将不起作用。假设stack1有[1,1,2]
,stack2有[1,2]
,这将返回true。
初始答案:由于JavaStack
是一个Vector
,它是一个Collection
(特别是一个List
),我们可以从堆栈中迭代或创建一个流并将其收集到ASet
(HashSet
)。这不会影响堆栈中的元素(不会被删除)。
或者简单地说,由于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));
我们可以使用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;
}
}
一种简单的方法是使用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编程语言 文档: 类具有 结构没有的 其他功能: 通过类型转换,您可以在运行时检查和解释类实例的类型。 因此,这对将来的某人可能会有所帮助: 和测试