N日一篇——Java实现队列
Posted 从零开始的智障生活
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N日一篇——Java实现队列相关的知识,希望对你有一定的参考价值。
目录
一、顺序队列
1.1 用接口实现顺序队列的抽象数据类型
public interface SequentialQueue {
public void setup(int size);// 初始化
public void enQueue(Object ob);// 入队
public Object deQueue();// 出队
public Object frontObject();// 队首元素
public boolean isEmpty();// 判断为空
}
1.2 创建带头结点的顺序队列
// 带头结点的队列
// 这里用头结点来避免逻辑循环数组中队满和队空问题
public class SQueuewithHead implements SequentialQueue{
private static final int DEFAULTSIZE = 4;
private int front;// 队首
private int rear;// 队尾
private int size;// 队列容量
private Object listArray[];// 队列
public SQueuewithHead() {
setup(DEFAULTSIZE);
}
public SQueuewithHead(int sz) {
setup(sz);
}
@Override
public void setup(int sz) {
size = sz+1;// 带一个无效数据头结点
front = 0;
rear = 0;
listArray = new Object[size];
}
@Override
public void enQueue(Object ob) {
// 增加一个新元素到队尾,
// 如果队尾的当前索引是size-1,即数组最后一个元素,那么下一个元素应当是在索引为0这个位置,
// 那么可以用(++rear)%size
System.out.println(front+" \\t "+rear);
if(front!=(rear+2)%size)// 判断非队满
listArray[(++rear)%size] = ob;
}
@Override
public Object deQueue() {
if(!isEmpty())return listArray[(++front)%size];// 出队一个队头元素
return null;
}
@Override
public Object frontObject() {
if(!isEmpty())return listArray[(front+1)%size];// 返回一个队头元素
return null;
}
public Object rearObject() {
if(!isEmpty())return listArray[rear];// 返回一个队尾元素
return null;
}
@Override
public boolean isEmpty() {
if(front == rear) return true;
return false;
}
}
1.3 测试顺序队列
public class TestSQ {
public static void main(String[] args) {
SQueuewithHead queue1 = new SQueuewithHead(10);
char[] chars = {'a','b','c','d'};
for(char c:chars) {
queue1.enQueue(c);
System.out.println("入队"+queue1.rearObject());
}
while(!queue1.isEmpty()) {
System.out.println("出队"+queue1.deQueue());
}
}
}
运行结果:
0 0
入队a
0 1
入队b
0 2
入队c
0 3
入队d
出队a
出队b
出队c
出队d
二、链式队列
2.1 用接口实现链式队列抽象数据类型
public interface LinkedQueue {
public void setup();
public void enqueue(Object ob);
public Object dequeue();
public Object frontObject();
public Object rearObject();
public boolean isEmpty();
}
2.2 创建链式队列的结点类型
public class List {
private Object object;
private List next;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public List getNext() {
return next;
}
public void setNext(List next) {
this.next = next;
}
public List(Object ob,List nextNode) {
object = ob;
next = nextNode;
}
}
2.3 创建不带头结点的链式队列
public class LinkedQueuewithoutHead implements LinkedQueue{
private List front;
private List rear;
public LinkedQueuewithoutHead() {
setup();
}
public LinkedQueuewithoutHead(int sz) {
setup();
}
public void setup() {
front = rear = null;
}
@Override
public void enqueue(Object ob) {
// 从队尾入队
if(rear!=null) {// 当队列非空
rear.setNext(new List(ob, null));//设置尾结点
rear = rear.getNext();//
}
else {// 当队列为空,第一个结点队头和队尾是同一个结点
front = rear=new List(ob,null);
}
}
@Override
public Object dequeue() {
// 从队头出队
if(!isEmpty()) {
Object it = front.getObject();// 获取将要出队的头结点元素
front = front.getNext();// 将原头结点的下一节点作为头结点
if(front ==null)// 如果删除的结点不仅是队头还是队尾,那么队尾也要被设置为空
rear = null;
return it;
}
return null;
}
@Override
public Object frontObject() {
if(!isEmpty()) {
return front.getObject();
}
return null;
}
@Override
public Object rearObject() {
if(!isEmpty()) {
return rear.getObject();
}
return null;
}
@Override
public boolean isEmpty() {
return front==null;// 队头为空
}
}
2.4 测试链式队列
public class TestLQ {
public static void main(String[] args) {
LinkedQueuewithoutHead queue = new LinkedQueuewithoutHead();
char[] chars = {'a','b','c','d'};
for(char c:chars) {
queue.enqueue(c);
System.out.println("入队"+queue.rearObject());
}
while(!queue.isEmpty()) {
System.out.println("出队"+queue.dequeue());
}
}
}
运行结果:
入队a
入队b
入队c
入队d
出队a
出队b
出队c
出队d
以上是关于N日一篇——Java实现队列的主要内容,如果未能解决你的问题,请参考以下文章