Как мне скопировать стек в Java? - PullRequest
19 голосов
/ 27 октября 2011

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

Спасибо!

Ответы [ 6 ]

25 голосов
/ 27 октября 2011

Просто используйте метод 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: это создает для меня предупреждение о «непроверенных или небезопасных операциях». любой способ сделать это без создания этой проблемы?

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

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

20 голосов
/ 27 октября 2011

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

Stack<Type> newStack = new Stack<Type>();
newStack.addAll(oldStack);
4 голосов
/ 27 октября 2011

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

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

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

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

0 голосов
/ 26 января 2019
 /**
     * 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;
            }

        }
    }
0 голосов
/ 26 января 2019
 /**
 * 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;
        }

    }
}
0 голосов
/ 27 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...