Java -- 链式队列和优先队列

  1. 链式队列
    什么是链式队列?
    数据结构的基本问题。队列 是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。一般队列的存储结构是顺序存储,当队列的存储结构是链式存储结构时(即队列中每个元素都包含一个指向其后继的指针,最后一个元素指针为null),就是链式队列,和链栈同理。
    链式队列的入队、出队、队头元素的实现;
package ShunXuZhan;
class LinkQueue{
    //创建一个内部结点类
    class Entry{
        int data;
        Entry next;

        public Entry(){//内部类构造函数初始化
            data=-1;
            next=null;
        }   
        public Entry(int data){//带参数的内部类构造函数
            this.data=data;
            this.next=null;
        }
    }

    private Entry front=null;//创建一个 front 域
    private Entry rear=null;//创建一个 rear 域
    private int usedSize=0;//链式队列有效数据个数
    //判断是否为空

    public boolean isEmpty(){
        return this.usedSize==0;
    }

    //入队应该用尾插法,方便
    public void insertTail(int val){
        if(isEmpty()){//如果队是空的话
            this.rear=new Entry(val);// new 一个 rear 结点
            this.front=this.rear;//将队尾赋值给队头
        }else{
            this.rear.next=new Entry(val);//队不为空的话,new 一个 rear.next 结点
            this.rear=this.rear.next;//rear指向它的下一个结点
        }
    }
    //出队
    public void pop(){
        if(isEmpty()){//如果队为空
            return;
        }else{//如果队不为空
            Entry cur=this.front;//将 this.front 赋值给 cur
            this.front=cur.next;//将 this.front 的下一个结点赋给 this.front 相当于头结点往后移了一位
            cur.next=null;//让最初的 front 结点为空
            this.usedSize--;//有效长度减一
        }
    }
    //获得栈顶元素
    public int getTop(){
        if(isEmpty()){//如果队列为空
            return -1;
        }
        return this.front.data;//不为空输出队头元素
    }
    //打印
    public void show(){
        Entry cur=this.front;//将 this.front 赋值给 cur
        while(cur!=null){//当 cur 不为空时
            System.out.println(cur.data+" ");//输出
            cur=cur.next;
        }
    }

}
public class LianShiDuiLie {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LinkQueue linkqueue=new LinkQueue();
        linkqueue.insertTail(10);
        linkqueue.insertTail(20);
        linkqueue.insertTail(30);
        linkqueue.show();
        System.out.println("========");
        linkqueue.pop();
        linkqueue.show();   
    }
}
  1. 优先队列:根据优先级进行 插入
package ShunXuZhan;
/*
 * 优先级队列:按照优先级进行存储,优先级越高,排在最前面
 * 
 * */
class PrioLink{

    class Entry{
        int data;
        int prio;//优先级
        Entry next;

        public Entry(){
            data=-1;
            prio=-1;
            next=null;
        }

        public Entry(int data,int prio){
            this.data=data;
            this.prio=prio;
            this.next=null;
        }
    }

    private Entry head=null;
    public PrioLink(){
        this.head=new Entry();
    }
    //插入,按照优先级插入
    public void insert(int data,int prio){
        Entry entry = new Entry(data,prio);//创造一个结点
        Entry cur = this.head;//将  头结点  赋值给 cur
        while(cur.next != null){//当头结点不为空
                if(cur.next.prio > entry.prio){//如果 某一个结点的优先级大于 entry 的优先级
                    break;//退出循环
                }
                cur=cur.next;
        }
        entry.next=cur.next;//为什么会有空指针呢
        cur.next=entry;
    }

    public void pop(){//删除
        Entry cur=this.head;
        if(cur.next == null){
            return; 
        }
        Entry del=cur.next;//从队头删除
        cur.next=del.next;
        del=null;
    }

    public void show(){
        Entry cur=this.head.next;
        while(cur != null){
            System.out.print(cur.data+" ");
            cur=cur.next;
        }
        System.out.println();
    }

}
public class YouDuiLie {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PrioLink l1=new PrioLink();
        l1.insert(10, 6);
        l1.insert(6, 2);
        l1.insert(2, 5);
        l1.show();
    }

}

输出:
这里写图片描述
插入 视图分析:
这里写图片描述
这里写图片描述
其余插入同理;
删除:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xyxy66/article/details/80285052