栈和队列的区别
栈
栈限制仅在表的一端进行插入和删除运算的线性表,先进后出
栈的优点是存取比较快,数据可以共享,但是栈数据中的大小和生存周期是确定的,灵活性较差
队列
队列限制仅在表的尾端进行插入,首端(前端)进行删除的线性表,先进先出
Java中栈和队列的实现
在java中要实现栈和队列,需要用到java集合的相关知识,特别是Stack、LinkedList等相关集合类型
栈的实现
栈的实现有两个方法:一个是用Java本身的集合类型Stack类型,另一个是借用LinkedList来间接实现Stack
1、Stack实现
直接用Stack实现常用的API方法如下
boolean isEmpty() 判断当前栈是否为空
synchronized E peek() 获得当前栈顶元素
synchronized E pop() 获得当前栈顶元素并删除
E push(E object) 将元素加入栈顶
synchronized search(Object o) 查找元素在栈中的位置,由栈底向栈顶方向数(以1为基数,返回int型)
2、LinkedList实现
LinkedList是一个继承于AbstractSequentialList的双向链表,它也可以被当做堆栈、队列或者双端队列进行操作
LinkedList实现LIst接口,能对它实现队列操作
Linked实现Deque接口,即能将LinkedList当作双端队列使用
当LinkedList被当做栈来使用时,常用API及对应关系如下:
栈方法 | 等效方法 |
---|---|
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
另外还有一个isEmpty()判断是否为空
利用LinkedList模拟实现栈结构(先进后出),入栈可以调用( h,b )方法,出栈可以调用( g,I,f )方法。利用LinkedList模拟实现队列结构(先进先出),入队可以调用( a,d,c )方法,出队可以调用(g,I,f )方法。(注意默认LinkedList头部入栈,尾部入队)
a) add()
b) addFirst()
c) addLast()
d) offer()
e) peek()
f) poll()
g) pop()
h) push()
i) remove()
队列的实现
Java中虽然有Queue接口,但是Java并没有给出具体的队列实现类,而Java中让LinkedList类实现了Queue接口,所以使用队列的时候一般采用LinkedList,因为LinkedList是双向链表,可以很方便的实现队列的各种功能
Queue使用时要尽量避免Collection的add()和remove()方法,而是使用offer()来添加元素,使用poll()来获取元素并移除元素。优点是通过返回值类可以判断成功与否,add()和remove()方法在失败的时候会抛出异常,如果使用前端而不移出该元素,使用element()或者peek()方法
所以Java中定义队列一般这样定义:
Queue<E> queue = new LinkedList<E>();
当采用LinkedList来实现时,API的使用和对应关系如下
队列方法 | 等效方法 |
---|---|
offer(e) | offer(e)/offerLast(e) 进出队列,将元素加在末尾 |
poll() | poll()/pollFirst() 获取队列头的元素并移除 |
peek() | peek()/peekFirst() 获取队列头的元素 |
isEmpty()判断是否为空
本篇为转载内容:java中栈和队列的实现和API的用法(详解)