循环链表与循环队列

本文介绍了单向和双向循环链表的概念,强调了它们在遍历上的优势和插入删除操作的区别。接着讨论了队列的‘假溢出’现象,并提出了循环队列作为解决方案,以避免存储空间浪费。此外,还提及了优先级队列在任务调度中的应用。最后,提供了循环队列的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单向循环链表

和普通的链表结构不同,单向循环链表的最后一个节点的指针指向了头结点,也就是和Head指针有相同的引用



和普通链表相比,循环链表不需要头指针,能够从任意位置实现链表遍历


双向循环链表

和单向链表相比,双向链表多了一个指向上一个节点的前向指针



相比于单向链表,双向循环链表的遍历更加灵活,但缺点是,进行插入和删除操作需要修改更多的指针


队列的“假溢出”


如上图所示,front和rear分别是队列的头、尾指针,在出入队列的过程中会出现一种现象:尾指针指向了对垒的尾部,也就是达到了maxSize,但这是,头指针并没有指向对头,这样就造成的存储空间的浪费,也会导致队列无法继续实现入队、出队操作。因此,提出了循环队列。

优先级队列

和普通的队列相比,优先级队列在出栈是是按照优先级进行的,也就是每次选取优先级最高的元素出列,这在计算机的任务调度中有很大的用处

    private Object element;   //数据域
    private int priority;     //用整型数字表示对雷元素的优先级

    public Element(Object element, int priority) {
        this.element = element;
        this.priority = priority;
    }
public Object delete() {
        if(isEmpty()){                //判断队列是否为空
            System.out.println("队列为空");
        }

                                     //找优先级最低的元素,默认为队头元素
        Element MIN = queue[0];
        int index = 0;
        for (int i = 0; i < count; i++) {
            if(queue[i].getPriority() < MIN.getPriority()){
                MIN = queue[i];
                index = i;
            }
        }

                                       //出队,后面的元素向前移
        for (int i = index + 1; i < count; i++) {
            queue[i -1] = queue[i];
            }
        rear--;
        count--;
        return MIN;
    }


循环队列


附上循环对垒的代码:

public class ImplQueue implements CircularQueue{

    static final  int defauleSize = 10;
    int front,rear,count,maxSize;
    Object[] queue;


    public static void main(String[] args) {
        ImplQueue circleQueue = new ImplQueue();
        circleQueue.append(10);
        circleQueue.append("d");
        circleQueue.append("sss");
        circleQueue.append(1);
        System.out.println(circleQueue.isEmpty());
        System.out.println(circleQueue.getFront());
        while (!circleQueue.isEmpty()){
            System.out.println(circleQueue.delete());
        }
    }

    //默认队列长度
    public ImplQueue() {
        rear = 0;
        front = 0;
        count = 0;
        maxSize = defauleSize;
        queue = new Object[defauleSize];
    }

    //自定义队列那长度
    public ImplQueue(int maxSize) {
        this.maxSize = maxSize;
        rear = 0;
        front = 0;
        count = 0;
        queue = new Object[maxSize];
    }

    @Override
    public void append(Object obj) {
        //判断队列是否为满
        if(front == rear && count > 0) {
            System.out.println("队列已满,无法插入");
        }else {
            queue[rear] = obj;
            rear = (rear + 1) % maxSize;
            count++;
        }
    }

    @Override
    public Object delete() {
        Object obj = null;
        //判断队列是否为空
        if(isEmpty()){
            System.out.println("队列为空,无法删除");
        }else {
            obj = queue[front];
            front = (front +1) % maxSize;
            count--;
        }
        return obj;
    }

    @Override
    public Object getFront() {
        Object obj = null;
        if(isEmpty()){
            System.out.println("队列为空");
        }else {
            obj = queue[front];
        }
        return obj;
    }

    @Override
    public boolean isEmpty() {
        return count == 0;
    }
}          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值