java数据结构:队列

队列的数据项都是队列尾插入,然后移向队列头,并从队列头删除或者获取。

 

队列需要一个头指针(front)和尾指针(rear),头指针会随着出队变动,rear会随着入队变动

 

两种常用队列 :线性队列,循环队列

线性队列和循环队列的区别是:线性队列会产生假溢出,即头指针和尾指针都到了size大小

 

数组实现队列:LineQueue.java

 

package Queue;

/**
 * @author zh
 * 利用数组模拟队列
 * 队列有两个个指针:头指针,尾指针。出队时尾指针改变,入队是头指针改变
 * 缺陷:假溢出(头指针与尾指针都为size),不采用
 */
public class LineQueue {

    private int size;//队列大小
    private int front;//头指针
    private int rear;//尾指针
    private Object data[] = null;//保存数据的数组

    //默认构造函数
    public LineQueue(){
        this.size = 10;
        this.front = -1;
        this.rear = -1;
        this.data = new Object[this.size];
    }

    //可改变大小的队列构造函数
    public LineQueue(int size){
        this.size =size;
        this.front = -1;
        this.rear = -1;
        this.data = new Object[this.size];
    }

    //入队方法
    public void inQueue(Object item){
        //首先判断队列是否已满
        if(rear < size-1){
            //尾指针改变
            rear++;
            //改变尾指针的值
            data[rear] = item;
        }else{
            System.out.println("队列已满");
        }
    }

    //出队方法
    public Object OutQueue() {
        Object item = null;
        //判断队列是否为空:头指针等于尾指针
        if(rear == front){
            System.out.println("队列为空");
        }
        front++;
        item = data[front];
        return item;
    }

    public void display(){
        if(front != rear){
            for(int i = front+1;i <= rear;i++){
                System.out.println(data[i]);
            }
        }
    }

    public static void main(String[] args){
        LineQueue queue = new LineQueue(20);
        for (int i= 0;i < 20;i++){
            queue.inQueue(i);
        }

//        for(int i = 0 ;i < 20 ;i++){
//            System.out.println(queue.OutQueue());
//        }
        Object out = queue.OutQueue();
        Object out2 = queue.OutQueue();
        System.out.println(out2);
//        queue.display();
    }

}

 

 

链表实现队列:

节点类:Node.java

 

package Queue;

/**
 * @author zh
 * 节点
 */
public class Node {
    Object data;
    Node next;
    //头结点
    public Node(){
        data = null;
        next = null;
    }
    //构造节点:重载
    public Node(Object data){
        this.data = data;
        next = null;
    }
}

 

队列类:LinkQueue.java

package Queue;

/**
 * @author zh
 * 链表实现队列(线性队列)
 * 不需要判断是否为满,链表不存在已满情况
 */
public class LinkQueue {
    Node head = null;
    public LinkQueue(){
        head = new Node();
    }

    //判断为空
    public boolean empty(){
        if(head.next == null)
            return true;
        return false;
    }

    //入队-->不需要判断满
    public void inQueue(Object item){
        //创建节点
        Node data = new Node(item);
        Node temp = head;
        while(temp.next != null){
            temp = temp.next;
        }
        temp.next = data;
    }

    //出队
    public Object outQueue(){
        Object item = null;
        if(empty()){
            System.out.println("队列为空");
            return item;
        }
        //获取第一个节点
        item = head.next.data;
        //删除第一个节点
        head.next = head.next.next;
        return item;
    }

    //遍历队列
    public void display(){
        Node temp = head;
        while(temp.next != null){
            System.out.println(temp.next.data);
            temp = temp.next;
        }
    }

    public static void main(String[] args){
        LinkQueue lq = new LinkQueue();

        lq.inQueue(1);
        lq.inQueue(2);
        lq.inQueue(3);
        lq.inQueue(4);
        lq.inQueue(5);

//        System.out.println(lq.outQueue());
//        System.out.println(lq.outQueue());
//        System.out.println(lq.outQueue());
//        System.out.println(lq.outQueue());
//        System.out.println(lq.outQueue());
        lq.display();
    }
}

循环队列:

 实现:LoopQueue.java

package Queue;

/**
 * @author zh
 * 循环队列:数组实现
 */
public class LoopQueue {

    int size;//队列大小
    int front;//头指针
    int rear;//尾指针
    Object data[] = null;//保存数据的数组

    //默认构造函数
    public LoopQueue(){
        this.size = 10;
        this.front = 0;
        this.rear = 0;
        this.data = new Object[this.size];
    }

    //可改变大小的队列构造函数
    public LoopQueue(int size){
        this.size =size;
        this.front = 0;
        this.rear = 0;
        this.data = new Object[this.size];
    }

    //判断队列已满
    public boolean full(){
        if((rear+1)%size == front)
            return true;
        return false;
    }

    //判断队列为空
    public boolean empty(){
        if(rear == front)
            return true;
        return false;
    }

    //入队
    public void inQueue(Object item){
        if(full()) {
            System.out.println("队列已满");
        }else{
            //保证循环,不会出现假溢出
            rear = (rear+1)%size;
            data[rear] = item;
        }
    }

    //出队
    public Object outQueue(){
        Object item = null;
        if(empty()){
            System.out.println("队列为空");
        }else{
            front = (front+1)%size;
            item = data[front];
        }
        return item;
    }

    //遍历队列
    public void display(){
        int f = front;
        int r = rear;
        while(f != r){
            f = (f+1)%size;
            System.out.println(data[f]);
        }
    }

    public static void main(String[] args){
        LoopQueue q = new LoopQueue();

        q.inQueue(1);
        q.inQueue(2);
        q.inQueue(3);
        q.inQueue(4);
        q.inQueue(5);
        q.inQueue(6);
        q.inQueue(7);
        q.inQueue(8);
        q.inQueue(9);
        q.inQueue(10);
        q.inQueue(11);
        q.inQueue(12);
        q.inQueue(13);

        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());

        q.inQueue(14);
        q.inQueue(15);
        q.inQueue(16);
        q.inQueue(17);
        q.inQueue(18);
        q.inQueue(19);

        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
        System.out.println("出队:"+q.outQueue());
    }
}

 

 

 

 

原文地址:https://www.cnblogs.com/advanceBlog/p/7900612.html