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