数据结构 队列

本文介绍了队列的基本概念,包括其先进先出的核心思想,并详细阐述了如何实现队列、循环队列以及优先级队列。优先级队列的特点是数据项按关键字有序,保证队头始终是最小或最大值。

1、核心思想:
类似于栈,不同的是队列中第一个插入的数据项会最先移除,即先进先出
队头取数据,队尾存数据。

2、实现队列

public class TestQueue {
    public static void main(String[] args) {
        Queue queue=new Queue(5);
        System.out.println(queue.isEmpty());

        queue.insert(50);
        queue.insert(51);
        queue.insert(52);
        queue.insert(53);
        queue.insert(54);

        System.out.println(queue.isEmpty());
        System.out.println(queue.isFull());

        while(!queue.isEmpty()){
            System.out.println(queue.remove());
        }

        //queue.insert(20);//报错,队尾存数据++end已经到了5,再存会越界
        queue.remove();//报错,队头移数据时font++到了5,再移会越界
    }

}

public class Queue {
    //数组
    private long[] arr;
    //最大空间
    private int maxSize;
    //有效元素大小
    private int elems;
    //队头
    private int font;
    //队尾
    private int end;

    //构造函数
    public Queue(int maxSize){
        this.maxSize=maxSize;
        arr=new long[maxSize];
        elems=0;
        font=0;
        end=-1;
    }

    //插入数据
    public void insert(long value){
        arr[++end]=value;//队尾存数据,从0开始
        elems++;
    }

    //移除数据
    public long remove(){
        elems--;
        return arr[font++];//队头移数据
    }

    //是否为空
    public boolean isEmpty(){
        return (elems==0);
    }

    //是否满了
    public boolean isFull(){
        return (end==maxSize-1);
    }

    //返回有效元素大小
    public int size(){
        return elems;
    }
}

3、循环队列

    public static void main(String[] args) {
        MyQueue queue=new MyQueue(5);
        System.out.println(queue.isEmpty());//true

        queue.insert(30);
        queue.insert(20);
        queue.insert(10);
        queue.insert(2);
        queue.insert(1);
        queue.insert(111);//已经满了再插入,会覆盖队头的30

        while(!queue.isEmpty()){
            System.out.print(queue.remove()+" ");
        }
        //111 20 10 2 1 111,注意有6个数,因为elems=6
    }

public class MyQueue {
    //数组
    private long[] arr;
    //最大空间
    private int maxSize;
    //有效元素大小
    private int elems;
    //队头
    private int font;
    //队尾
    private int end;

    //构造函数
    public MyQueue(int maxSize){
        this.maxSize=maxSize;
        arr=new long[maxSize];
        elems=0;
        font=0;
        end=-1;
    }

    //插入数据
    public void insert(long value){
        if(end==maxSize-1){
            end=-1;//循环队列,赋初值
        }
        arr[++end]=value;//队尾存数据,从0开始
        elems++;
    }

    //移除数据
    public long remove(){
        long tmp=arr[font++];
        if(font==maxSize){
            font=0;//循环队列,赋初值
        }
        elems--;
        return tmp;//队头移数据
    }

    //是否为空
    public boolean isEmpty(){
        return (elems==0);
    }

    //是否满了
    public boolean isFull(){
        return (elems==maxSize);
    }

    //返回有效元素大小
    public int size(){
        return elems;
    }

}

4、优先级队列

核心思想:数据项按关键字的值有序。关键字最小或最大的总在队头,数据项插入时会按照顺序插入到合适的位置,以确保队列的顺序。


public class TestQueue {
    public static void main(String[] args) {
        PriorityQueue queue=new PriorityQueue(10);
        System.out.println(queue.isEmpty());//true

        queue.insert(30);
        queue.insert(10);
        queue.insert(40);
        queue.insert(1);
        queue.insert(2);


        while(!queue.isEmpty()){
            System.out.print(queue.remove()+" ");
        }
        //1 2 10 30 40 
    }

}
public class PriorityQueue {
    //数组
    private long[] arr;
    //最大空间
    private int maxSize;
    //有效元素大小
    private int elems;


    //构造函数
    public PriorityQueue(int maxSize){
        this.maxSize=maxSize;
        arr=new long[maxSize];
        elems=0;

    }

    //插入数据:从大到小排序,找比自己小的,移到其前
    public void insert(long value){
        int i;
        for(i=0;i<elems;i++){
            if(value>arr[i]){
                break;//4插到5,3,1中:当4>3,i=1,brak
            }
        }

        for(int j=elems;j>i;j--){
            arr[j]=arr[j-1];//将3,1全部右移到arr[2],arr[3],空出arr[1]
        }
        arr[i]=value;//将4填到arr[1]
        elems++;
    }

    //移除数据:先移除最小的
    public long remove(){
        long value=arr[elems-1];
        elems--;
        return value;
    }

    //是否为空
    public boolean isEmpty(){
        return (elems==0); 
    }

    //是否满了
    public boolean isFull(){
        return (elems==maxSize);
    }

    //返回有效元素大小
    public int size(){
        return elems;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值