当前位置: 首页 > news >正文

【队列】循环顺序队列和链式队列

IQueue.java

public interface IQueue<T> {
    int count();
    // 队列是否为空
    boolean isEmpty();
    void clear();
    // 添加元素到队尾
    void add(T item);
    // 出队
    T out();
    T getFront();

}

CSeqQueue.java

public class CSeqQueue<T> implements IQueue<T> {
    private T[]data;
    private int maxsize;
    private int front;
    private int rear;

    public CSeqQueue(int maxsize){
        data = (T[]) new Object[maxsize];
        this.maxsize=maxsize;
        front =rear=0;
    }

    @Override
    public int count() {
        return (rear - front - maxsize) % maxsize;
    }

    @Override
    public boolean isEmpty() {
        return front == rear;
    }

    @Override
    public void clear() {
        front = rear;
    }

    @Override
    public void add(T item) {
        if ((rear +1 + maxsize) % maxsize == front) {
            System.out.println("队列已满!");
            return;
        }
        rear = (rear +1) % maxsize;
        data[rear] = item;
    }

    @Override
    public T out() {
        if (isEmpty()) {
            throw new RuntimeException("队列已经满了!");
        }
        front = (front + 1) % maxsize;
        return data[front];
    }

    @Override
    public T getFront() {
        if (isEmpty()) {
            throw new RuntimeException("队列已经满了!");
        }
        return data[front + 1];
    }
}


CSeqQueueMain.java

public class CSeqQueueMain {
    public static void main(String[] args) {
        // 创建一个容量为5的循环队列
        CSeqQueue<Integer> queue = new CSeqQueue<Integer>(10);

        // 测试isEmpty方法
        System.out.println("队列是否为空: " + queue.isEmpty()); // 应该输出 true

        // 测试in方法,向队列中添加元素
        queue.add(10);
        queue.add(20);
        queue.add(30);
        queue.add(40);
        queue.add(10);
        queue.add(20);
        queue.add(30);

        // 测试count方法
        System.out.println("队列中的元素数量: " + queue.count());

        // 测试getFront方法
        System.out.println("队列的头部元素: " + queue.getFront());

        // 测试out方法,移除队列中的元素
        System.out.println("移除的元素: " + queue.out());
        System.out.println("移除的元素: " + queue.out());

        // 再次测试count方法
        System.out.println("队列中的元素数量: " + queue.count());

        // 测试clear方法
        queue.clear();
        System.out.println("队列是否为空: " + queue.isEmpty());

        // 测试队列满的情况
        queue.add(50);
        queue.add(60);
        queue.add(70);
        queue.add(80);
        queue.add(90); // 队列已满,无法继续添加
        queue.add(100); // 应该输出 "Queue is full!"

        // 测试count方法
        System.out.println("队列中的元素数量: " + queue.count()); // 应该输出 4
    }
}

Node.java

public class Node<T> {
    T data;
    Node<T> next;

    public Node() {
    }

    public Node(T data) {
        this.data = data;
        this.next = null;
    }
}


LinkQueue.java


public class LinkQueue<T> implements IQueue<T> {
    private Node<T> front;
    private Node<T> rear;
    public LinkQueue() {
        front = rear = new Node<T>();
    }

    @Override
    public int count() {
        Node<T> p = front;
        int len = 0;
        while (p != null) {
            ++len;
            p = p.next;
        }
        return len-1;
    }

    @Override
    public boolean isEmpty() {
        return front.next == null;
    }

    @Override
    public void clear() {
        front.next = null;
        rear = front;
    }

    @Override
    public void add(T item) {
        Node<T> q = new Node<T>(item);
        rear.next = q;
        rear = q;
    }

    @Override
    public T out() {
        if (isEmpty()) {
            throw  new RuntimeException("Queue is empty");
        }
        Node<T> p = front.next;
        front.next = p.next;
        if (count() == 0) {
            rear = front;
        }
        return p.data;
    }

    @Override
    public T getFront() {
        if (isEmpty()) {
            throw  new RuntimeException("Queue is empty");
        }
        Node<T> p = front.next;
        return p.data;
    }
}


LinkQueueMain.java

public class LinkQueueMain {

    public static void main(String[] args) {
        // 创建一个LinkQueue对象
        LinkQueue<Integer> queue = new LinkQueue<Integer>();

        // 测试isEmpty()方法
        System.out.println("队列是否为空: " + queue.isEmpty()); // 应该输出 true

        // 测试in()方法
        queue.add(10);
        queue.add(20);
        queue.add(30);

        // 测试count()方法
        System.out.println("队列中的元素数量: " + queue.count()); // 应该输出 3

        // 测试getFront()方法
        System.out.println("队头元素: " + queue.getFront()); // 应该输出 10

        // 测试out()方法
        System.out.println("出队元素: " + queue.out()); // 应该输出 10
        System.out.println("出队后队列中的元素数量: " + queue.count()); // 应该输出 2

        // 再次测试getFront()方法
        System.out.println("队头元素: " + queue.getFront()); // 应该输出 20

        // 测试clear()方法
        queue.clear();
        System.out.println("清空队列后是否为空: " + queue.isEmpty()); // 应该输出 true

        // 测试在空队列上调用out()和getFront()方法
        try {
            queue.out();
        } catch (RuntimeException e) {
            System.out.println("尝试从空队列出队时抛出异常: " + e.getMessage());
        }

        try {
            queue.getFront();
        } catch (RuntimeException e) {
            System.out.println("尝试获取空队列的队头元素时抛出异常: " + e.getMessage());
        }
    }
}

相关文章:

  • 传感器研习社:臭味传感器(Odorant Sensor)
  • 【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation
  • Java的表达式自动类型提升
  • Netty中的直接内存是怎么回事?
  • 【leetcode hot 100 78】子集
  • companion object和object 从kotlin转java分析
  • lua实现面向对象(封装/继承/多态)
  • AI大白话(三):深度学习——AI的‘大脑‘是如何构建的?
  • 批量将 PPT 转换为PDF/XPS/JPG图片等其它格式
  • 【IROS 2025】CMU提出路径规划器PIPE:机器人探索效率提升14.6%,地图准确率提高9.3%!
  • 《真·出师表》
  • 剑指 Offer II 112. 最长递增路径
  • 51c大模型~合集73
  • 基于ArcGIS和ETOPO-2022 DEM数据分层绘制全球海陆分布
  • C++20 新特性:深入理解 `std::basic_string<char8_t>` 和 `char8_t`
  • QML指示控件:PageIndicator
  • 【重构小程序】基于Tika和Langchain4J进行文件解析和文本切片(二)
  • 自然语言处理(Natural Language Processing,NLP)入门教程
  • AfxMessageBox()和MessageBox()的差异。
  • OpenCV旋转估计(2)用于自动检测波浪校正类型的函数autoDetectWaveCorrectKind()
  • 权威访谈丨国家疾控局就《世界卫生组织大流行协定》答记者问
  • 法国参议院调查委员会公布雀巢“巴黎水”丑闻调查报告
  • 广东茂名高州市山体滑坡已致3死1失联,搜救仍在继续
  • 视觉周刊|走进变革中的博物馆
  • 西藏普兰县公安局网安大队向自媒体人宣传网络安全知识
  • 83岁山水花鸟画家、书法家吴静山离世,系岭南画派代表人物