Как скопировать стек в 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;
}
}
}