Java中栈和队列

栈和队列的区别

栈限制仅在表的一端进行插入和删除运算的线性表,先进后出
这里写图片描述
栈的优点是存取比较快,数据可以共享,但是栈数据中的大小和生存周期是确定的,灵活性较差

队列

队列限制仅在表的尾端进行插入,首端(前端)进行删除的线性表,先进先出
这里写图片描述

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的用法(详解)

猜你喜欢

转载自blog.csdn.net/anticlql/article/details/75895146
今日推荐