Java:Stack(从一个堆栈中删除一个元素,并通过用户输入堆栈

时间:2018-05-26 13:11:26

标签: java arraylist stack

如何让用户输入输入以消除从​​堆栈A到堆栈B的元素?例如,我有3个堆栈:st,st2,st3。我想让用户选择他们想要从哪个堆栈中删除要添加该元素的堆栈的元素。假设用户输入“From: 0 ”和“To: 1 ”,这意味着程序要从 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]);
 }
}

2 个答案:

答案 0 :(得分:0)

调用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]

javadoc

中明确添加了添加null的原因
  

如果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[]。因此,每个复制语句都会发出警告。

请参阅What is a raw type and why shouldn't we use it?

修改 你的问题和尝试表明了不同的意图。以上内容将帮助您将Stack的元素放入一个数组中。如果需要将堆栈本身存储在数组中,则需要声明Stack [] stacks = new Stack[3]

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

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

答案 1 :(得分: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