java中可用arraylist模拟栈,通过仅在末尾增删实现lifo;需封装泛型类处理空栈异常,但实际推荐使用arraydeque。

Java 中可以用 ArrayList 模拟栈(Stack)行为,核心是只在列表末尾进行添加和删除操作,遵循后进先出(LIFO)原则。
用 ArrayList 模拟栈的基本操作
ArrayList 提供了 add(E) 和 remove(int) 方法,配合 size() 和 get(int) 就能完整实现栈的四个基本操作:
-
push:调用
list.add(element),元素加到末尾 -
pop:调用
list.remove(list.size() - 1),移除并返回末尾元素 -
peek:调用
list.get(list.size() - 1),只查看末尾元素(不移除) -
isEmpty:调用
list.isEmpty()或判断list.size() == 0
封装成一个简易 Stack 类
为提高可读性和复用性,建议封装成泛型类。注意处理空栈时的异常:
<font color="#888">public class SimpleStack<e> {
private final ArrayList<e> data;
<pre class="brush:java;toolbar:false;">public SimpleStack() {
this.data = new ArrayList<>();
}
public void push(E item) {
data.add(item);
}
public E pop() {
if (data.isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return data.remove(data.size() - 1);
}
public E peek() {
if (data.isEmpty()) {
throw new IllegalStateException("Stack is empty");
}
return data.get(data.size() - 1);
}
public boolean isEmpty() {
return data.isEmpty();
}
public int size() {
return data.size();
}
}
使用示例与注意事项
这样使用即可:
<font color="#888">SimpleStack<string> stack = new SimpleStack();
stack.push("A");
stack.push("B");
System.out.println(stack.peek()); // B
System.out.println(stack.pop()); // B
System.out.println(stack.pop()); // A</string></font>
注意几点:
- 不要用
ArrayList的索引插入(如add(0, x))或中间删除,否则破坏栈逻辑 - 如果需要线程安全,应额外加锁或改用
CopyOnWriteArrayList(但通常不推荐用于栈场景) - Java 自带的
Stack类已过时,官方推荐用ArrayDeque;若坚持用ArrayList,仅限学习或简单场景
和 ArrayDeque 的对比说明
虽然 ArrayList 可以模拟栈,但它在末尾 remove 时仍是 O(1) 平均时间(因为不涉及元素移动),但底层数组扩容/缩容机制不如 ArrayDeque 针对栈优化。实际开发中更推荐:
- 用
ArrayDeque作为栈:它没有线程安全开销,且push/pop/peek接口更语义清晰 - 避免继承
ArrayList或Stack,优先组合 + 封装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











