如何用Java复制堆栈?

时间:2011-10-27 17:23:27

标签: java string copy stack

我有一个堆栈A,我想创建一个与堆栈A相同的堆栈B.我不希望堆栈B只是一个指向A的指针 - 我实际上想要创建一个包含A的新堆栈堆栈A的相同元素与堆栈A的顺序相同。堆栈A是一堆字符串。

谢谢!

6 个答案:

答案 0 :(得分:25)

只需使用Stack-class的clone()方法(它实现Cloneable)。

这是一个简单的JUnit测试用例:

@Test   
public void test()
{
    Stack<Integer> intStack = new Stack<Integer>();
    for(int i = 0; i < 100; i++)        
    {
        intStack.push(i);
    }

    Stack<Integer> copiedStack = (Stack<Integer>)intStack.clone();

    for(int i = 0; i < 100; i++)            
    {
        Assert.assertEquals(intStack.pop(), copiedStack.pop());
    }
}

编辑:

  

tmsimont:这会为我创建一个“未经检查或不安全的操作”警告。任何   如何做到这一点,而不会产生这个问题?

我起初回应说警告是不可避免的,但实际上可以使用<?>(通配符)-typing来避免:

@Test
public void test()
{
    Stack<Integer> intStack = new Stack<Integer>();
    for(int i = 0; i < 100; i++)
    {
        intStack.push(i);
    }

    //No warning
    Stack<?> copiedStack = (Stack<?>)intStack.clone();

    for(int i = 0; i < 100; i++)
    {
        Integer value = (Integer)copiedStack.pop(); //Won't cause a warning, no matter to which type you cast (String, Float...), but will throw ClassCastException at runtime if the type is wrong
        Assert.assertEquals(intStack.pop(), value);
    }
}

基本上我会说你仍在进行从?(未知类型)到Integer的未经检查的演员表,但是没有警告。就个人而言,我仍然希望直接投射到Stack<Integer>并使用@SuppressWarnings("unchecked")来抑制警告。

答案 1 :(得分:20)

Stack扩展了Vector,因此您可以新建一个新Stack并使用.addAll(...)复制这些项目:

Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);

答案 2 :(得分:4)

Stack类是AbstractList的子类。

简单地将其视为AbstractList,使用get(int index)方法迭代堆栈中的元素,从0到列表/堆栈的长度,并将元素添加到新堆栈。

这不会复制元素 - 它会将元素添加到新堆栈中。如果您还需要复制元素,则需要深入了解其他级别并创建元素的副本,并将这些元素添加到新堆栈中。

您可以使用clone方法执行full (or "deep") copies,但请注意,该对象必须实现Clonable界面才能获得deep copies of objects

答案 3 :(得分:0)

您想使用clone方法。

答案 4 :(得分:0)

 /**
     * Copy constructor for the Stack class
     * @param original the Stack to copy
     * @postcondition a new Stack object which is
     * an identical, but distinct, copy of original
     */
    public Stack(Stack<T> original) {
        if (original.length == 0)
        {
            length = 0;
            top = null;
        } else
        {
            Node temp = original.top;
            while (temp != null)
            {
                push(temp.data); // inserts into this
                temp = temp.next;
            }
            temp = top;
            temp = temp.next;
            top.next = null;
            while (temp != null){
                push(temp.data); // inserts into this
                temp = temp.next;
            }

        }
    }

答案 5 :(得分:-1)

 /**
 * Copy constructor for the Stack class
 * @param original the Stack to copy
 * @postcondition a new Stack object which is
 * an identical, but distinct, copy of original
 */
public Stack(Stack<T> original) {
    if (original.length == 0)
    {
        length = 0;
        top = null;
    } else
    {
        Node temp = original.top;
        while (temp != null)
        {
            push(temp.data); // inserts into this
            temp = temp.next;
        }
        temp = top;
        temp = temp.next;
        top.next = null;
        while (temp != null){
            push(temp.data); // inserts into this
            temp = temp.next;
        }

    }
}