Deque接口实现栈功能

参考资料:Java中用Deque接口代替Stack接口完成栈功能

引言

最近在LeetCode或者牛客网上刷题时,发现很多关于栈的题目的题解都是使用Deque来实现栈的功能,之前我一直都是使用Stack接口来实现栈
Stack<T> stack = new Stack<>()
但在Java Doc里建议用Deque替代Stack接口完成栈的功能

原因

Deque继承自Queue,而Stack继承自Vector
Vector是由数组实现的集合类,他包含了大量集合处理的方法。而Stack之所以继承Vector,是为了复用Vector中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是Stack设计不好的地方,既然只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承Vector,Stack和Vector本来是毫无关系的。这使得Stack在基于数组实现上效率受影响,另外因为继承Vector类,Stack可以复用Vector大量方法,这使得Stack在设计上不严谨,例如Vector中的:
public void add(int index, E element) {
    insertElementAt(element, index);
}
可以在指定位置添加元素,这与Stack 的设计理念相冲突(栈只能在栈顶添加或删除元素)。所以Java后来修正了这个不良好的设计,提出了用Deque代替Stack的建议。

Deque

Java中的Deuqe,即“double ended queue”的缩写,是Java中的双端队列集合类型,可以由ArrayDeuqe或者LinkedList实现,两者使用的区别以及优劣类似于数组和链表
常用方法
  • 适用于栈的peek(), push(), pop()方法
  • 适用于队列的方法add(), offer(), remove(), poll(), peek()等方法
  • 适用于双端队列的相关方法

全部评论

相关推荐

kyw_:接好运
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务