Talk is cheap show me the code.今天还将展示队列的实现,也是基于顺序表和链表的基础,可见顺序表和链表有多重要。
队列的顺序存储
package com.chenli.Queue;
import java.util.Arrays;
/**
* 循环队列的顺序存储
* @author 陈力
*
* @param <E>
*/
@SuppressWarnings("all")
public class MyQueue<E> {
public Object data[]=null;
private int maxSize;//队列最大容量
private int rear;//队列尾,允许插入
private int front;//队列头,允许删除
private int size;//队列当前长度
//构造函数
public MyQueue(){
this(10);//默认构造容量为10的队列
}
public MyQueue(int initialSize) {
if(initialSize>0){
this.maxSize = initialSize;
data = new Object[initialSize];
rear = front = 0;
}else{
throw new RuntimeException("初始长度不能小于0");
}
}
//判断是否为空
public boolean isEmpty(){
return size == 0;
}
//队列长度
public int length(){
return size;
}
//入队
public boolean add(Object obj){
if(size == maxSize){
throw new RuntimeException("队列已满");
}else{
data[rear]= obj;
rear = (rear+1)%maxSize;//rear指针向后移动一位,若到最后,转到数组头部。
size++;
return true;
}
}
//返回队首元素,但不移除。
public Object peek(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}else{
return data[front];
}
}
//出队
public Object poll(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}else{
Object obj = data[front];
data[front]=null;
front = (front+1)%maxSize;
size--;
return obj;
}
}
//清空队列
public void clear(){
Arrays.fill(data, null);//不懂Arrays用法可以去查它的api文档
size = 0;
front =0;
rear = 0;
}
}
队列的链式存储
package com.chenli.Queue;
/**
* 队列的链式存储结构
* @author 陈力
*
*/
@SuppressWarnings("all")
public class MyLinkedQueue {
private Node front;//队首指针
private Node rear;//队尾指针
private int size;//队列中的元素
//构造函数
public MyLinkedQueue(){
this.front=null;
this.rear=null;
this.size=0;
}
//判断队列是否为空
public boolean isEmpty(){
return size==0;
}
//队列的长度
public int length(){
return size;
}
//入队
public boolean add(Object obj){
Node newNode = new Node(obj);//生成新的结点
if(isEmpty()){//队列为空的情况
front = newNode;//队首指针直接指向新结点
rear = front;//此时只有一个结点,所以队首队尾指针都指向同一个结点。
size++;
return true;
}else{
rear.next = newNode;//新结点添加到队尾结点后面
rear = newNode;//此时新结点成为队尾结点
size++;
return true;
}
}
//获取队列元素
public Object peek(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}else{
return front.data;
}
}
//出队
public Object poll(){
if(isEmpty()){
throw new RuntimeException("队列为空");
}else{
Node removeNode = front;//记录要删除的结点
front = removeNode.next;//队首指针指向要删除结点的后继结点
removeNode.next = null;//删除结点的指针与赋值为null
size--;
return removeNode.data;//返回删除结点的值
}
}
}
LinkedList实现队列
package com.chenli.Queue;
import java.util.LinkedList;
/**
* LinkedList实现队列
* @author 陈力
*
*/
public class LinkedListQueue {
private LinkedList<Object>list = new LinkedList<Object>();
//判断队列是否为空
public boolean isEmpty(){
return list.isEmpty();
}
//入队
public void add(Object obj){
list.offerLast(obj);
}
//获取队首元素但不移除
public Object peek(){
return list.peekFirst();
}
//出队
public Object poll(){
return list.pollFirst();
}
}
前指针(front)、后指针(rear)
队满的条件:(rear+1)%maxsize = front
通用的计算队列的长度:(rear - front + maxsize)%maxsize