数据结构学习----顺序循环队列(Java实现)
2014-10-21 10:59 雪夜&流星 阅读(379) 评论(0) 编辑 收藏 举报队列抽象数据类型, 队列接口,描述队列抽象数据类型:
package com.clarck.datastructure.queue; /** * 队列抽象数据类型, 队列接口,描述队列抽象数据类型 * * @author clarck * * @param <T> */ public interface QQueue<T> { /** * 判断队列是否为空 * * @return */ boolean isEmpty(); /** * 元素x入队 * * @param x */ void enqueue(T x); /** * 出队,返回队头元素 * * @return */ T dequeue(); }
顺序循环队列类,实现队列接口:
package com.clarck.datastructure.queue; /** * 顺序循环队列类,实现队列接口 * * @author clarck * * @param <T> */ public class SeqQueue<T> implements QQueue<T> { /** * 存储队列数据元素 */ private Object element[]; /** * front、rear分别为队列头尾下标 */ private int front, rear; /** * 构造容量为length的空队列 * * @param length */ public SeqQueue(int length) { // 设置队列数组容量最小值 if (length < 64) { length = 64; } // 设置空队列 this.element = new Object[Math.abs(length)]; this.front = this.rear = 0; } /** * 构造默认容量的空队列 */ public SeqQueue() { this(64); } /** * 判断队列是否空,若空返回true */ @Override public boolean isEmpty() { return this.front == this.rear; } /** * 元素x入队,空对象不能入队 */ @Override public void enqueue(T x) { if (x == null) return; // 当队列满时,扩充容量 if (this.front == (this.rear + 1) % this.element.length) { Object[] temp = this.element; // 重新申请一个容量更大的数组 this.element = new Object[temp.length * 2]; int j = 0; // 按照队列元素次序复制数组元素 for (int i = this.front; i != this.rear; i = (i + 1) % temp.length) { this.element[j++] = temp[i]; } this.front = 0; this.rear = j; } this.element[this.rear] = x; this.rear = (this.rear + 1) % this.element.length; } /** * 出队,返回队头元素,若队列空返回null */ @SuppressWarnings("unchecked") @Override public T dequeue() { // 若队列空返回null if (isEmpty()) return null; // 取得队头元素 T temp = (T) this.element[this.front]; this.front = (this.front + 1) % this.element.length; return temp; } /** * 返回队列所有元素的描述字符串,形式为“(,)”,按照队列元素次序 */ @Override public String toString() { String str = "("; if (!isEmpty()) { str += this.element[this.front].toString(); int i = (this.front + 1) % this.element.length; while (i != this.rear) { str += ", " + this.element[i].toString(); i = (i + 1) % this.element.length; } } return str + ")"; } }
队列测试类:
package com.clarck.datastructure.queue; /** * 队列测试类 * * @author clarck * */ public class Queue_test { public static void main(String args[]) { SeqQueue<Integer> que = new SeqQueue<Integer>(5); que.enqueue(new Integer(10)); que.enqueue(new Integer(20)); System.out.println("dequeue: " + que.dequeue().toString() + " " + que.dequeue().toString() + " "); System.out.println(que.toString()); que.enqueue(new Integer(30)); que.enqueue(new Integer(40)); que.enqueue(new Integer(50)); que.enqueue(new Integer(60)); System.out.println(que.toString()); que.enqueue(new Integer(70)); System.out.println(que.toString()); } }
测试结果:
dequeue: 10 20 () (30, 40, 50, 60) (30, 40, 50, 60, 70)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2013-10-21 设计模式——简单工厂模式(SimpleFactory Pattern)