本文已参与「新人创作礼」活动,一起开启掘金创作之路。
大家都知道,在java中,可以用stack来实现栈结构。但是由于stack的底层实现,为了线程安全而使用了大量的synchronized修饰符,导致使用起来效率比较低。现在比较推荐的是用deque(double ended queue)来实现栈(以及队列)结构。
deque的常见初始化方式有两种:
1.Deque<Integer> queue=new ArrayDeque<>();//一般用于队列
2.Deque<Integer> stack=new LinkedList<>();//一般用于栈
ArrayDeque底层由数组实现,LinkedList底层由链表实现,所以它们各自适合的使用情况相信大家都很清楚了,在此不做赘述。
Deque中的主要方法:
| 队列方法 | 作用 |
|---|---|
| add | 向队尾插入元素,失败则抛出异常 |
| offer | 向队尾插入元素,失败则返回false |
| remove | 移除队首元素,失败则抛出异常 |
| poll | 移除队首元素,失败则返回null |
| peek | 获取队首元素但不移除,失败则返回null |
| 栈方法 | 作用 |
|---|---|
| push | 向栈顶插入元素,失败则抛出异常 |
| pop | 弹出栈定元素,失败则抛出异常 |
| peek | 查看栈顶元素但不移除,失败抛出异常 |
# 总结:
deque做队列时,常用方法为offer/poll/peek。做栈时,常用方法为push/pop/peek;
可能有小伙伴会产生疑问,deque怎么区分peek方法应该弹出的是队首还是栈顶元素呢,它怎么知道我现在实现的是队列还是堆栈结构?
其实不管是队列还是堆栈结构,peek的作用都是一样的,就是类似于返回数组中下标为0的那个元素。理由是当我们用offer方法向队列中压入'c','y','h'以后,队列存储结构就是'c','y','h'的顺序,peek会查看到元素'c'。但是当我们用push方法向栈中依次压入'c','y','h'以后,栈的存储结构是'h','y',c',那么peek方法当然也会查看到“下标为0的元素”,也就是'h'啦。
由于本人水平有限,文章中可能会出现不准确甚至错误之处,欢迎大家及时评论指出。