java学习笔记-集合之栈和队列
2017-10-03 15:56
141 查看
栈Stack
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。boolean empty() //判断栈是否为空 Object peek() //查看堆栈顶部的对象,但不从堆栈中移除它。 Object pop() //移除堆栈顶部的对象,并作为此函数的值返回该对象。 Object push(E element) //把项压入堆栈顶部。 int search(Object element) //返回对象在堆栈中的位置,以 1 为基数。
下面的代码演示了栈的基本用法
public static void main(String[] args) { Stack<String> stack = new Stack<String>(); stack.push("a"); stack.push("b"); stack.push("c"); stack.push("d"); System.out.println("stack中栈顶的元素: "+ stack.peek()); System.out.println("stack中b的元素索引: "+ stack.search("b")); while(!stack.empty()){ System.out.print( stack.pop() + " " ); } }
输出结果为
stack中栈顶的元素: d stack中b的元素索引: 3 d c b a
队列 Queue
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。Queue的主要方法如下
boolean add(Object element) //向队的末尾添加元素,如果队列已满,会抛出异常 boolean offer(Object element) //相队的末尾添加元素,如果队列已满,返回false,推荐使用 Object remove() //删除并返回队列头部的元素,如果队列为空抛出异常 Object poll() //删除并返回队列头部的元素,如果队列为空返回null,推荐使用 Object element() //返回队列头部的元素,如果队列为空抛出异常 Object peek() //返回队列头部的元素,如果队列为空返回null,推荐使用
一般队列 Queue
一般队列的示例代码如下public static void main(String[] args) { Queue<String> queueList = new LinkedList<>(); //使用offer方法 queueList.offer("a"); queueList.offer("b"); queueList.offer("c"); queueList.offer("d"); System.out.println("queueList peek 栈顶元素: " + queueList.peek()); while(!queueList.isEmpty()) { System.out.print( queueList.poll() + " " ); } System.out.println( "\n队列为空 poll " + queueList.poll()); System.out.println( "队列为空 peek " + queueList.peek()); //使用add方法 queueList.add("a"); queueList.add("b"); queueList.add("c"); queueList.add("d"); System.out.println("queueList element 栈顶元素: " + queueList.element()); while(!queueList.isEmpty()) { System.out.print( queueList.remove() + " " ); } try { System.out.println( "\n队列为空 remove " + queueList.remove()); }catch(NoSuchElementException e){ System.out.print("\n队列为空 remove 捕获异常 " ); } try { System.out.println( "\n队列为空 element " + queueList.element()); }catch(NoSuchElementException e){ System.out.print("\n队列为空 element 捕获异常 " ); } }
输出结果为
queueList peek 栈顶元素: a a b c d 队列为空 poll null 队列为空 peek null queueList element 栈顶元素: a a b c d 队列为空 remove 捕获异常 队列为空 element 捕获异常
双向队列 Deque
Queue接口是单向队列,它有一个子接口Deque,表示双向队列。双向队列的特点是在队列的头部和尾部都可以添加或删除元素。它可以使用new ArrayDeque<>()来初始化,同时LinkedList实现了它的接口,也可使用new LinkedList<>()来初始化。主要方法如下
//向队列的头部或者尾部添加元素,如果队列已满会抛出异常 void addFirst(Object element) void addLast(Object element) //向队列的头部或者尾部添加元素,如果队列已满返回false boolean offerFirst(Object element) boolean offerLast(Object element) //从头部或尾部删除元素,如果队列为空抛出异常 Object removeFirst() Object removeLast() //从头部或尾部删除元素,如果队列为空返回nul Object pollFirst() Object pollLast() //从队列头部或者尾部获取元素,如果队列为空抛出异常 Object getFirst() Object getLast() //从队列头部或者尾部获取元素,如果队列为空返回null Object peekFirst() Object peekLast()
示例代码
public static void main(String[] args) { Deque<String> deque = new ArrayDeque<String>(); deque.offer("b"); deque.offerFirst("a"); deque.offerLast("c"); deque.offer("d"); System.out.println("遍历双向队列 " ); for(String atr : deque) { System.out.print(atr + " " ); } }
输出结果
遍历双向队列 a b c d
优先级队列 PriorityQueue
优先级队列会按照排序的方式对队列中的元素进行排序和检索。因此加入到PriorityQueue中的对象必须实现Comparable接口,提供对元素排序时两个元素之间的比较规则。示例代码
public static void main(String[] args) { Queue<String> priorityQueue = new PriorityQueue<String>(); priorityQueue.add("c"); priorityQueue.add("a"); priorityQueue.add("d"); priorityQueue.add("b"); System.out.println("遍历优先级队列 " ); for(String atr : priorityQueue) { System.out.print(atr + " " ); } System.out.println("\n依次删除优先级队列中的元素"); while(!priorityQueue.isEmpty()) { System.out.print(priorityQueue.poll() + " " ); } }
注意的是,用foreach语句遍历优先级队列时,获得元素并没有排序,而在通过poll()或者remove()方法删除元素时,该方法总会删除当前队列中最小的元素。
以上代码输出结果为
遍历优先级队列 a b d c 依次删除优先级队列中的元素 a b c d
LinkedList
LinkedList在实现中采用了链表的数据结构,对顺序访问进行了优化,向Lsit中插入和删除元素的速度较快,随机访问则相对较慢。而且LinkedList实现了实现了较多的接口,它可以作为栈、队列和双向队列使用。示例代码如下
public static void main(String[] args) { LinkedList<String> linkList = new LinkedList<>(); System.out.println("linkList stack: "); linkList.push("a"); linkList.push("b"); linkList.push("c"); linkList.push("d"); while(!linkList.isEmpty()) { System.out.print( linkList.pop() + " " ); } System.out.println(); System.out.println("linkList queue offer方法: "); linkList.offer("a"); linkList.offer("b"); linkList.offer("c"); linkList.offer("d"); while(!linkList.isEmpty()) { System.out.print( linkList.poll() + " " ); } System.out.println(); System.out.println("linkList queue add方法: "); linkList.add("a"); linkList.add("b"); linkList.add("c"); linkList.add("d"); while(!linkList.isEmpty()) { System.out.print( linkList.remove() + " " ); } }
输出结果如下
linkList stack: d c b a linkList queue offer方法: a b c d linkList queue add方法: a b c d
相关文章推荐
- Java分布式应用学习笔记04JDK的并发包的集合总结
- JAVA核心技术学习笔记(第七版,Ⅱ高级特性之集合)
- JAVA集合学习笔记
- java学习笔记:集合框架之TreeSet
- 黑马程序员________Java集合Map及其JDK1.5新特性泛型机制的学习笔记
- 集合 java基础学习笔记 第四天
- JAVA学习笔记--集合
- 【Java学习笔记】集合框架的学习
- JAVA学习笔记(十)基于LinkedList实现栈和队列
- java学习笔记——自定义实现Stack集合
- 黑马程序员-java基础-集合学习笔记
- 黑马程序员-java集合 学习笔记
- Java学习笔记44:常用集合使用
- java学习笔记:集合框架之TreeSet
- JAVA并发编程学习笔记之MCS队列锁
- 【Java学习笔记】集合类
- 黑马程序员---- Java学习笔记:1.异常 2.集合
- Java学习笔记(集合)
- 【转】Java集合框架学习笔记
- java学习笔记-集合框架-黑马