java版数据结构——队列的实现

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

猜你喜欢

转载自blog.csdn.net/weixin_42870497/article/details/86761637