Java数据结构与算法之Queue队列
2016-10-04 15:57
399 查看
目录:
1.队列概述
2.队列分类
3.数组实现自定义队列
4.链表实现自定义队列
1.队列概述
队列是一种特殊的线性表,它可以通过数组与链表两种方式实现,它与单链表和数组的区别是它只能从队尾添加元素,
队首删除元素,同时满足先进先出(IFIO)的原则。
2.队列分类
3.数组实现自定义队列
(1)自定义队列接口CustomQueue.java
(2)数组实现对列自定义类CustomArrayQueue.java
(3)测试类
(4)控制台打印输出
4.链表实现自定义队列
(1)自定义队列接口(与3一致)
(2)链表自定义队列类
(3)测试类
(4)控制台打印输出
文章:
Java数据结构与算法之学习路线
Java数据结构与算法之Array数组
1.队列概述
2.队列分类
3.数组实现自定义队列
4.链表实现自定义队列
1.队列概述
队列是一种特殊的线性表,它可以通过数组与链表两种方式实现,它与单链表和数组的区别是它只能从队尾添加元素,
队首删除元素,同时满足先进先出(IFIO)的原则。
2.队列分类
3.数组实现自定义队列
(1)自定义队列接口CustomQueue.java
package com.datastructure.test; /* * 自定义的队列接口,定义队列需要实现的方法,提供给类继承实现 */ public interface CustomQueue<T> { //入队函数,实现队列添加元素 public void put(T data)throws Exception; //出队函数,实现队列元素删除 public T remove()throws Exception; //判断是否队列为空 public boolean isEmpty(); //获取队列的长度 public int size(); //获取队列队头元素 public T getFrontElement()throws Exception; }
(2)数组实现对列自定义类CustomArrayQueue.java
package com.datastructure.test; public class CustomArrayQueue<T> implements CustomQueue<T> { //默认队列长度 static final int defaultSize = 15; //队列元素集合 private T[] queueVals; //队列长度 private int size; //队列第一个对象的位置 private int front; //队列当前对象的位置 private int rear; /* * 默认构造方法,设置默认队列长度为15 */ @SuppressWarnings("unchecked") public CustomArrayQueue (){ front=rear=0; size = 0; queueVals = (T[]) new Object[defaultSize]; } /* * 带参构造方法,队列长度可自定义 */ @SuppressWarnings("unchecked") public CustomArrayQueue (int defineSize){ front=rear=0; size = 0; queueVals = (T[]) new Object[defineSize]; } /* * 添加对象到队列中 */ @Override public void put(T data) throws Exception { if (size>0 && front==rear) { throw new Exception("队列已经满辣!"); }else { queueVals[rear] = data; rear =(rear+1)%(queueVals.length); size++; } } /* * 从队列中队首元素 */ @Override public T remove() throws Exception { T object = null; if (isEmpty()) { throw new RuntimeException("队列什么也没有啦!"); }else { //获取队首对象元素 object = queueVals[front]; //将队首元素置为null queueVals[front] = null; front =(front+1)%(queueVals.length); size--; } return object; } /* * 判断队列是否为空 */ @Override public boolean isEmpty() { return size==0; } /* * 获取队列长度 */ @Override public int size() { return size; } /* * 获取队列队首元素 */ @Override public T getFrontElement() throws Exception { if (isEmpty()) { throw new RuntimeException("队列什么也没有啦!"); }else { return queueVals[front]; } } }
(3)测试类
package com.datastructure.test; public class ArrayQueueTest { public static void main(String[] args) { CustomArrayQueue<String> queue = new CustomArrayQueue<String>(10); try { System.out.println("队列是否为空:"+queue.isEmpty()); queue.put("A"); queue.put("B"); queue.put("C"); queue.put("D"); queue.put("E"); System.out.println("队首元素为:"+queue.getFrontElement()); System.out.println("队列长度:"+queue.size()); System.out.print("移除元素:"); while (!queue.isEmpty()) { System.out.print(queue.remove()+" "); } System.out.println(); System.out.println("队列长度:"+queue.size()); } catch (Exception e) { e.printStackTrace(); } } }
(4)控制台打印输出
队列是否为空:true 队首元素为:A 队列长度:5 移除元素:A B C D E 队列长度:0
4.链表实现自定义队列
(1)自定义队列接口(与3一致)
(2)链表自定义队列类
package com.datastructure.test; public class CustomLinkedQueue<T> implements CustomQueue<T> { private Node front; private Node rear; private int size; public CustomLinkedQueue(){ //初始化时设置首尾节点都为空 front = rear =null; //初始化节点数为0 size = 0; } /* * 添加新节点到尾部 */ @Override public void put(T data) throws Exception { Node newNode = new Node(data, null); if (isEmpty()) { front = newNode; //将新节点设置为尾节点 rear = newNode; }else { //尾节点后面添加新节点 rear.nextNode = newNode; //将新节点设置为尾节点 rear = newNode; } size++; } /* * 移除队首元素 */ @Override public T remove() throws Exception { T object = null; if (isEmpty()) { throw new RuntimeException("队列是空的哟!"); }else { //保存队首元素值 object = front.data; //将下一节点设置为队首节点 front =front.nextNode; } size--; return object; } /* * 判断队列是否为空 */ @Override public boolean isEmpty() { return size==0; } /* * 返回队列的长度 */ @Override public int size() { return size; } /* * 返回队列首节点数据 */ @Override public T getFrontElement() throws Exception { return front.data; } /** * 节点内部类 */ class Node { T data; Node nextNode; /* * 头节点构造方法 */ public Node(Node nextNode){ this.nextNode =nextNode; } /* * 其他节点构造方法 */ public Node(T data,Node nextNode){ this.data=data; this.nextNode =nextNode; } } }
(3)测试类
package com.datastructure.test; public class LinkedQueueTest { public static void main(String[] args) { CustomLinkedQueue<String> queue = new CustomLinkedQueue<String>(); try { System.out.println("队列是否为空:"+queue.isEmpty()); queue.put("A"); queue.put("B"); queue.put("C"); queue.put("D"); queue.put("E"); System.out.println("队首元素为:"+queue.getFrontElement()); System.out.println("队列长度:"+queue.size()); System.out.print("移除元素:"); while (!queue.isEmpty()) { System.out.print(queue.remove()+" "); } System.out.println(); System.out.println("队列长度:"+queue.size()); } catch (Exception e) { e.printStackTrace(); } } }
(4)控制台打印输出
队列是否为空:true 队首元素为:A 队列长度:5 移除元素:A B C D E 队列长度:0
文章:
Java数据结构与算法之学习路线
Java数据结构与算法之Array数组
Java数据结构与算法之LinkedList单链表
Java数据结构与算法之Queue队列
Java数据结构与算法之stack栈
相关文章推荐
- java数据结构与算法之(Queue)队列设计与实现
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- java数据结构与算法之(Queue)队列设计与实现
- CAS(Compare and Swap)无锁算法 与 ConcurrentLinkedQueue 队列
- Java数据结构和算法(五)——队列
- 利用C#队列集合(Queue)写的一个算法
- Java数据结构和算法(五)——队列
- Java数据结构与算法:队列
- Java数据结构与算法解析(三)——队列与背包
- Java数据结构和算法--栈与队列
- 4.[数据结构和算法分析笔记]队列 Queue
- Java数据结构与算法 - 栈和队列
- java数据结构与算法-优先级队列
- java数据结构和算法------队列
- Java数据结构和算法(五)——队列
- javascript 队列(queue)算法与说明
- java数据结构和算法-2,栈和队列
- Java数据结构和算法-栈和队列(1-前言+栈)
- 利用Queue队列实现FIFO的算法
- java数据结构与算法 第4章 栈和队列