N日一篇——Java实现队列

9 篇文章 1 订阅
8 篇文章 0 订阅

 

目录

一、顺序队列

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从零开始的智障生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值