栈的实现
在java中,栈有两种实现方式,一个是用Stack类,一个用LinkedList类实现。
//用Stack实现栈
public static Stack<String> stack1;
//用LinkedList实现栈
public static LinkedList<String> stack2;
public static void init() {
stack1 = new Stack<>();
stack1.push("1");
stack1.push("2");
stack1.push("3");
stack1.push("4");
stack2 = new LinkedLIst<>();
stack2.push("1");
stack2.push("2");
stack2.push("3");
stack2.push("4");
System.out.println(stack1);
System.out.println(stack2);
}
输出结果为:
[1, 2, 3, 4] //(Stack)
[4, 3, 2, 1] //(LinkedList)
两者区别就是元素存放顺序刚好是相反的:
1. Stack类是用数组实现的,push和pop都是对数组最高下标成员进行操作;
2. LinkedLIst是用双向链表实现的,push和pop都是通过对链表first头节点进行操作的;。
push()
调用的addFirst()
, pop()
调用的removeFirst()
;
队列的实现
双端队列—ArrayDeque类实现Deque接口
使用了可变数组,容量没有限制。ArrayDeque是线程不安全的,没有外部同步的情况下,不能在多线程环境下使用。作为队列来使用,效率高域LinkedList。
同时也可以作为栈来使用,效率高于Stack;
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。**
- 队列操作
add(E e) 在队列尾部添加一个元素;
offer(E e) 在队列尾部添加一个元素,并返回是否成功
remove() 删除队列中第一个元素,并返回该元素的值,如果元素为null,将抛出异常(其实底层调用的是removeFirst())
poll() 删除队列中第一个元素,并返回该元素的值,如果元素为null,将返回null(其实调用的是pollFirst())
element() 获取第一个元素,如果没有将抛出异常
peek() 获取第一个元素,如果返回null
LinkedList也可以实现双端队列
- 方法介绍
addFirst(E e)
-addLast(E e)与add(E e)
都可以实现在链表结尾last插入节点,add还会返回bool值true,addLast无返回值;
getFirst()
-getLast()
removeFirst()
-removeLast()
add()是尾插
- 数据结构
- 栈 : 主要是用于实现堆栈数据结构的存储方式。
先进后出:push() 、pop() - 队列(双端队列1.5): 主要是为了让你们可以使用LinkedList模拟队列数据结构的存储方式。
先进先出:offer()调用add(E e)结尾last插入、poll()调用removeFirst();
- 栈 : 主要是用于实现堆栈数据结构的存储方式。
Queue和Deque对应
Stack和Deque对应
队头和栈顶都是左侧头部!