数据结构Java实现——②队列

写在前面


转眼数据结构这本书就学完了,但是一直学习的是C版的,感觉很不爽,就借了本Java版的自学了点,感觉还不错, 特此共享。此处是队列


文字描述


队列的特点就是先进先出,其功能可以比作一个管道,如图

只能从一端添加,在另一端删除,对每一个元素而已,先进先出


代码描述


1、队列的抽象接口

package org.Stone6762.MQueue;

/**
 * @ClassName_MQueue
 * @author_Stone6762
 * @Description_
 */
public interface MQueue {

	/** 
	 * @Describe_清空
	 */
	public void clear();

	/** 
	 * @Describe_是否为空
	 * @return
	 */
	public boolean isEmpty();

	/** 
	 * @Describe_队列的长度
	 * @return
	 */
	public int length();

	/** 
	 * @Describe_读取对首的元素
	 * @return
	 */
	public Object peek();

	/** 
	 * @Describe_入队
	 * @param data
	 * @throws Exception
	 */
	public void offer(Object data) throws Exception;

	/** 
	 * @Describe_出对
	 * @return
	 */
	public Object poll();

}

2、队列的顺序存储

package org.Stone6762.MQueue.imple;

import org.Stone6762.MQueue.MQueue;

/**
 * @ClassName_SqQueue顺序队列
 * @author_Stone6762
 * @Description_
 */
public class SqQueue implements MQueue {

	/**
	 * @queueElem存储队列的元素
	 */
	private Object queueElem[];

	/**
	 * @rear指向对尾元素的下一个存储位置
	 */
	private int rear;

	/**
	 * @front指向对首元素
	 */
	private int front;

	public SqQueue(int maxSize) {
		queueElem = new Object[maxSize];
		rear = front = 0;
	}

	@Override
	public void clear() {
		rear = front = 0;
	}

	@Override
	public boolean isEmpty() {
		return rear == front;
	}

	@Override
	public int length() {
		return front - rear;
	}

	@Override
	public Object peek() {
		if (!isEmpty()) {
			return queueElem[front];
		}
		return null;
	}

	@Override
	public void offer(Object data) throws Exception {
		if (rear == queueElem.length) {
			throw new Exception("队列已满!!!");
		} else {
			queueElem[rear] = data;
			rear++;
		}
	}

	@Override
	public Object poll() {
		if (isEmpty()) {
			return null;
		} else {
			Object elem = queueElem[front];
			front++;
			return elem;
		}
	}

}

3、队列的链式存储


package org.Stone6762.MQueue.imple;

import org.Stone6762.MQueue.MQueue;
import org.Stone6762.entity.Node;

/**
 * @ClassName_LinkQueue队列的链式存储
 * @author_Stone6762
 * @Description_
 */
public class LinkQueue implements MQueue {

	/**
	 * @front指向队首结点
	 */
	private Node front;

	/**
	 * @rear指向队尾结点
	 */
	private Node rear;

	public LinkQueue() {
		front = rear = null;
	}

	@Override
	public void clear() {
		front = rear = null;
	}

	@Override
	public boolean isEmpty() {
		return front == null;
	}

	@Override
	public int length() {
		int length = 0;
		if (front != null) {
			// 创建一个指针指向队首元素,然后移动该指针,而不是移动队首元素,因为队首元素和队尾元素只有当出对和入队时才移动
			Node t = front;
			while (t != null) {
				t = t.getNext();
				length++;
			}
		}
		return length;
	}

	@Override
	public Object peek() {
		if (front != null) {
			return front.getData();
		} else {
			return null;
		}
	}

	@Override
	public void offer(Object data) throws Exception {
		Node newNode = new Node(data);
		/*
		 * 插入第一个元素时必须特殊处理
		 */
		if (front != null) {
			rear.setNext(newNode);
			rear = newNode;
		} else {
			front = rear = newNode;
		}
	}

	@Override
	public Object poll() {
		if (front != null) {
			Node t = front;
			front = front.getNext();
			/*
			 * 删除时,对最后一个元素进行判断
			 */
			if (t == rear) {
				rear = null;
			}
			return t.getData();
		} else {
			return null;
		}

	}

}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值