Как скопировать стек в Java?

У меня есть стек A, и я хочу создать стек B, который идентичен стекю A. Я не хочу, чтобы стек B просто был указателем на A - я действительно хочу создать новый стек B, который содержит те же элементы, что и стек A, в том же порядке, что и стек A. Стек A представляет собой стек строк.

Спасибо!

Ответы

Ответ 1

Просто используйте метод clone() класса Stack (он реализует 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());
    }
}

Edit:

tmsimont: это создает для меня предупреждение "непроверенные или небезопасные операции". Любые способ сделать это без возникновения этой проблемы?

Сначала я ответил, что предупреждение будет неизбежным, но на самом деле его можно избежать, используя <?> (wildcard) -типирование:

@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").

Ответ 2

Stack extends Vector, поэтому вы можете просто создать новый Stack и использовать .addAll(...) для копирования элементов:

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

Ответ 3

Класс Stack является подклассом AbstractList.

Просто относитесь к нему как к элементу AbstractList, итерации через элементы в стеке с помощью метода get(int index), от 0 до длины вашего списка/стека и добавления элементов в новый стек.

Это не будет копировать элементы - это добавит элементы в новый стек. Если вам нужно также скопировать элементы, вам нужно пройти еще один уровень и создать копии элементов и добавить их в новый стек.

Вы можете сделать полные (или "глубокие" ) копии, используя метод clone, но обратите внимание, что объект должен реализовать Clonable, чтобы получить глубокие копии объектов.

Ответ 4

Вы хотите использовать метод clone.

Ответ 5

 /**
     * 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;
            }

        }
    }

Ответ 6

да пожалуйста asasp

Schinken riecht nach erdnüssen wenn man ihn zersägt


Schinken riecht nach erdnüssen wenn man ihn zersägt

е

Ответ 7

 /**
 * 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;
        }

    }
}