Java:堆栈(从一个堆栈中删除一个元素,并通过用户输入哪个堆栈添加到哪个堆栈来添加到另一个堆栈



如何让用户输入以消除从堆栈 A 到堆栈 B 的元素?例如,i hv 3 个堆栈:st、st2、st3。我想让用户选择要从哪个堆栈中删除元素以及要将该元素添加到哪个堆栈。假设用户输入"From:0"和"To:1",这意味着程序hv从st中删除元素并将删除的元素添加到st2。我知道其中一种方法是这样的:">st2.push(st.pop(((">,它将从st堆栈中删除元素并添加到st2堆栈。但这就是我现在想要的。我希望它是这样的:st(i(.push(st(i(.pop(((,其中">i"表示用户输入的堆栈位置。

为什么调用hello[0]只返回">bye"而不是整个st堆栈?

package stack; 
import java.util.*;
public class StackDemo {
public static void main(String args[]) {
// creating stack
Stack st = new Stack();
Stack st2 = new Stack();
Stack st3 = new Stack();
// populating stack
st.push("Java");
st.push("Source");
st.push("code");
st2.push("hello");
st3.push("bye");
String[] hello = new String[3];
st.toArray(hello);
st2.toArray(hello);
st3.toArray(hello);
System.out.println("hello: ");
System.out.println("Get 0: " + hello[0]);
}
}

toArray(arrName( 函数以数组的形式返回整个列表的内容,给定列表中元素的类型与数组 arrName 的类型匹配。

它不存储对列表本身的引用。我再说一遍,它只在类型匹配的情况下存储在列表中的元素。否则,它会引发异常。ArrayStoreException 在类型不匹配的情况下被抛出。

对于您问题的第一部分, 我会说维护一个 Stack 类型的 ArrayList 并在其中添加 Stack 对象。然后,您可以使用 ArrayList 的 get(index( 实例方法访问对 Stack 对象的引用。

ArrayList<Stack> at = new ArrayList<>();
at.add(st);
at.get(0); //returns a reference to st

调用toArray不会将值追加到数组中。这是来自Vector.toArray的javadoc

按正确的顺序返回包含此 Vector 中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果 Vector 适合指定的数组,则在其中返回。否则,将分配一个具有指定数组的运行时类型和此 Vector 大小的新数组。

st.toArray(hello); //Now, the array contains [Java, Source, code]
st2.toArray(hello); //the array is now [hello, null, code]
st3.toArray(hello);//the array is now [bye, null, code]

添加null的原因清楚地添加到javadoc中

如果 Vector 适合指定的数组,并留出空间(即,数组的元素多于 Vector(,则紧跟在 Vector 末尾之后的数组中的元素设置为 null。

要将三个堆栈的内容复制到数组中,您可以执行以下操作

String[] myHello = new String[st.size() + st2.size() + st3.size()];
System.arraycopy(st.toArray(), 0, myHello, 0, st.size());
System.arraycopy(st2.toArray(), 0, myHello, st.size(), st2.size());
System.arraycopy(st3.toArray(), 0, myHello, st.size() + st2.size(), st3.size());
System.out.println(Arrays.toString(myHello)); //[Java, Source, code, hello, bye]

请注意,由于使用的是原始类型,因此调用st.toArray()将返回Object[]而不是String[]。因此,每个 copy 语句都会发出警告。

请参阅什么是原始类型,为什么我们不应该使用它?

编辑:您的问题和尝试显示出不同的意图。以上将帮助您将堆栈的元素放入一个数组中。如果需要将堆栈本身存储在数组中,则需要声明Stack [] stacks = new Stack[3]

stacks[0] = st;
stacks[1] = st2;
stacks[2] = st3;

有了这个,你可以做stacks[i].push(stacks[i].pop());

最新更新