执行此代码时出现错误:
线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:1,大小:0
因此,在堆栈中,您永远不能从位置 n,n=1,2,...,无穷大添加对象,它将始终从位置 0 开始?
我的想法是pila.add("(");
把它放在位置 0。
public static void main(String[] args){
LinkedList<String> pila=new LinkedList<>();
pila.add(1,"1");
pila.add(2,"2");
pila.add(3,"3");
pila.add(4,"*");
pila.add("(");
System.out.println(pila);
}
根据类文档
LinkedList
,异常由以下人员引发:IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())
。当您创建它时它是空的,因此它的pila
大小为零(0
pila.add(1,"1");
index 1
"1"
index
pila.add(0,"1");
现在,由于堆栈的行为是最后一个入是第一个出,所以您应该始终使用索引 0 添加或删除
如果您想要更具体的堆栈实现,可以使用 Stack 类https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html
栈和队列的思想是不知道元素的位置,只使用可用的元素,也就是头部。
关于您的问题,恰好您的列表
LinkedList
为空,因此您无法在位置 1 添加元素。首先您必须在初始位置添加一个元素。该方法List#insert(int index, E elem)
表明这样的元素必须存在。旁注,要在 Java 中使用队列,最好使用
Queue<E>
. 例子:离开:
为了与堆栈交互,尽管存在一个类,但
Stack
不推荐使用它,因为它扩展Vector
了技术上已弃用的类。相反,最好使用接口Deque
和像ArrayDeque
o这样的实现LinkedList
:离开:
我担心第一次尝试在小于当前大小的位置添加到集合时会发生错误。如果列表的大小为 0,则不能将其添加到位置 1。您可以使用类完美地完成您想要的操作,
LinkedList
但在插入中使用索引时必须尊重列表的大小:该方法
add
被重载,如果您打算模拟堆栈的行为,则必须在每种情况下使用适当的版本您正在尝试将元素添加到不存在的索引
您的问题是,在创建列表时,它的大小为 1 个节点(索引 0),但您尝试向第二个节点添加一个元素,该节点不存在。实际上,您应该在索引 0 处开始添加元素。
现在,我看到您正在尝试在特定索引处插入。这正是堆栈和队列试图阻止的。
堆栈是 LIFO 类型的结构。
LIFO和FIFO类型结构不允许您在任意位置添加元素,但数据插入和提取始终与第一个或最后一个元素相关联。
它们的设计使您不必担心物品的顺序。
LIFO 类型结构
LIFO 是后进先出的首字母缩写词。电池符合此标准。
把一堆想象成一堆要洗的盘子。你放下的第一个脏盘子留在底部。当你洗它们时,第一个盘子将是最后一个出来的。
先进先出型结构
FIFO 是First In, First Out的首字母缩写词。队列符合这个标准。
你可以想象一个超市排队。第一个到队列的人是第一个出来的人。
关于您的实施
如果你想实现一个栈(后进先出),java 集合提供了几种方法:
使用类
Stack
。此类恰好代表您正在寻找的堆栈。但他有问题。正如它在文档中所说,它继承自 class
Vector
,一个几乎被遗忘的类。此外,通过继承而不是实现,你会得到不灵活的行为,提供你不想要的东西,这是不推荐的。使用接口
Deque
及其实现。Deque
它的发音是“Deck”,意思是“Shuffle”,同时支持 LIFO 和 FIFO 操作。您可以将其视为queues 和 stacks 之间的融合。这个界面更现代,不再从
Vector
. 确实,它Deque
在两端都提供了推拉功能,这可能比您正在寻找的功能更多,但它也提供了选择是否需要 FIFO 或 LIFO 结构的灵活性。在我看来,如果你想要一个Exclusively FIFO 或 LIFO结构,你应该使用这个接口及其实现
ArrayDeque
。一个示例堆栈:
离开: