N日一篇——Java实现队列

Posted 从零开始的智障生活

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了N日一篇——Java实现队列相关的知识,希望对你有一定的参考价值。

 

目录

一、顺序队列

1.1 用接口实现顺序队列的抽象数据类型

1.2 创建带头结点的顺序队列

1.3 测试顺序队列

二、链式队列

2.1 用接口实现链式队列抽象数据类型

2.2 创建链式队列的结点类型

2.3 创建不带头结点的链式队列

2.4 测试链式队列


一、顺序队列

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实现队列的主要内容,如果未能解决你的问题,请参考以下文章

N日一篇——Java实现队列

N日一篇——Java实现栈

N日一篇——二叉树

N日一篇——二叉树

N日一篇——二叉树

N日一篇——Java实现链式表