java语言实现队列

来源:互联网 发布:淘宝客怎么打推广 编辑:程序博客网 时间:2024/06/06 16:29

队列的接口

package edu.lqstudy.chaptor.chaptor22.queue;public interface Queue {/**插入一个元素到队列尾部*/    public void enQueue(Object obj) throws Exception;    /**删除队列头部的元素,并且返回其值*/    public Object deQueue() throws Exception;    /**获取队列头部的值,但是不删除*/    public Object queueFront() throws Exception;    /**判断队列是否为空*/    public boolean isEmpty();}

队列的实现方式

这里有两种实现方式,一种是顺序存储结构,另一种是链式存储结构
添加元素移动tail的值,删除元素移动head的值

顺序存储结构实现队列

package edu.lqstudy.chaptor.chaptor22.queue;/** * 循环队列,head指向的位置没有值,这是为了区分队列满和空的必要妥协 *  * @author hacker * */public class SeqQueue implements Queue{private Object[] queue;//队列的数据区private int head = 0;//(head + 1)%size为队列的头部private int tail = 0;//队列的尾部private int size = 0;//queue数组的容量,队列的容量为size - 1/** * 无参构造函数,队列的容量默认为10 *  */SeqQueue(){size = 10 + 1;queue = new Object[size];}/** * 构造函数,根据给定的n生成容量为n的队列, *  * @param int n */SeqQueue(int n){queue = new Object[n + 1];size = n + 1;}@Overridepublic void enQueue(Object obj) throws Exception {// TODO Auto-generated method stubif(isFull()){throw new Exception("队列已满");}else{    tail = (tail + 1)%size;this.queue[tail] = obj;}}@Overridepublic Object deQueue() throws Exception {// TODO Auto-generated method stubObject obj = null;if(isEmpty()){throw new Exception("队列已空");}else{head = (head + 1)%size;obj = queue[head];}return obj;}@Overridepublic Object queueFront() throws Exception {// TODO Auto-generated method stubObject obj = null;if(isEmpty()){throw new Exception("队列已空");}else{int index = (head + 1)%size;obj = queue[index];}return obj;}@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn tail == head;}/** * 判断队列是否已满 * @return boolean */public boolean isFull(){return (tail + 1)%size == head;//如果tail在向前走一步等于head,//说明队列已经饶了一圈,则已经满了}    /** * 返回队列中元素的个数 * @return int */public int getLength(){return (size + tail - head)%size;//如果tail > head,值为tail - head//如果tail < head 值为size - (head - tail),都是元素的个数}/** * 返回描述对象信息的String对象 * 格式为: * 初始大小:(int) * head值: (int) * tail值: (int) * size值:  (int) *  */public String toString(){String s = "初始大小" + getLength() + "\nhead值:" +          head + "\ntail值: " + tail + "\nsize值: " + size;return s;//}}

链式结果实现队列

package edu.lqstudy.chaptor.chaptor22.queue;/** * 使用链式存储结构实现队列,实现了两个类: * Node类:结点类,相当于集合的元素 * LinkQueue类:相当于存储元素的集合 * @author hacker * */public class LinkQueue implements Queue{    private Node head;//指向队列头元素    private Node tail;//指向队列尾元素    private int len;//添加,删除数据时改变len的值        /**构造函数*/    LinkQueue(){    head = tail = null;    len = 0;    }@Overridepublic void enQueue(Object obj) throws Exception {// TODO Auto-generated method stub    Node n = new Node(obj);if(isEmpty()){head = tail = n;//如果添加元素到空队列,说明head值会改变//并且tail之前的值为null;}else{tail.setNext(n);//原结点指向新生成的结点tail = n;}len++;}@Overridepublic Object deQueue() throws Exception {// TODO Auto-generated method stubObject ans = null;if(isEmpty())throw new Exception("从空队列中移除对象是不予许的");else{Node n = head;//获取头结点head = head.getNext();//将head指针指向下一个结点len--;if(isEmpty())//如果删除的是最后一个元素,说明tail的值也发生了变化tail = null;ans = n.getObj();}return ans;}@Overridepublic Object queueFront() throws Exception {// TODO Auto-generated method stubObject obj = null;if(isEmpty())throw new Exception("从空队列中查找元素是不予许的");else{Node n = head;obj = n.getObj();}return obj;}@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn len == 0;}public int length(){return len;}}class Node{private Object obj;//存储的对象private Node next = null;//下一个对象的指针public Node(){obj = null;}public Node(Object obj){this.obj = obj;}public Node(Object obj,Node next){this(obj);this.next = next;}public Object getObj(){return obj;}public Node getNext(){return next;}public void setNext(Node next){this.next = next;}}




0 0
原创粉丝点击