Java写数据结构:队列

1.概念:

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头Head/Front)

2.队列的方法:

接下来模拟实现上述方法:

双向链表实现:

先创建最基本的成员变量和构造方法,内部类

复制代码
public class MyQueue {
    //内部类
    static class ListNode{
        public int val;
        public ListNode prev;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
     public ListNode first;
    public ListNode last;
    public int useSize;

}

实现offer方法

复制代码
 public void offer(int val){
        ListNode node = new ListNode(val);
        if(isEmpty()) {
            first = last = node;
        }else{
            last.next = node;
            node.prev = last;
            last = last.next;
        }
        useSize++;
    }
public boolean isEmpty(){
        return useSize == 0;
    }

实现poll方法

复制代码
public int poll(){
        if(isEmpty()){
            return -1;
        }else {
            int val = first.val;
            first = first.next;
            if(first != null){
                first.prev = null;
            }
            useSize--;
            return val;
        }
    }
public boolean isEmpty(){
        return useSize == 0;
    }

实现peek方法

复制代码
public int peek(){
        if(isEmpty()){
            return -1;
        }else {
            int val = first.val;
            return val;
        }
    }

    public boolean isEmpty(){
        return useSize == 0;
    }

测试:

复制代码
public class Test {
 //MyQueue
    public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        myQueue.offer(1);
        myQueue.offer(2);
        myQueue.offer(3);
        myQueue.offer(4);

        System.out.println(myQueue.useSize);
        System.out.println(myQueue.peek());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.peek());
        System.out.println(myQueue.useSize);
    }
}

用循环数组实现队列:

先创建最基本的成员变量和构造方法

复制代码
public class MyCircleQueue {
 public int front;
    public int rear;
    public int[] elem;

    public MyCircleQueue(int k) {
        elem = new int[k + 1];
    }
}

实现入队方法

复制代码
 public boolean enQueue(int val){
        if(isFull()){
            return false;
        }else {
            elem[rear] = val;
            rear = (rear + 1) % elem.length;
            return true;
        }
    }
public boolean isFull(){
        return front == (rear + 1) % elem.length;
    }

实现出队方法

复制代码
public boolean deQueue(){
    if(isEmpty()){
        return false;
    }else {
        front = (front + 1) % elem.length;
        return true;
    }
}
public boolean isEmpty(){
        return front == rear;
    }

获得队头元素

复制代码
//获得队列的头元素
    public int Front(){
        if(isEmpty()){
            return -1;
        }else{
            return elem[front];
        }
    }
 public boolean isEmpty(){
        return front == rear;
    }

测试:

复制代码
public class Test {
//循环数组实现队列
    public static void main(String[] args) {
        MyCircleQueue myCircleQueue = new MyCircleQueue(10);
        myCircleQueue.enQueue(1);
        myCircleQueue.enQueue(2);
        myCircleQueue.enQueue(3);
        myCircleQueue.enQueue(4);

        System.out.println(myCircleQueue.Front());
        System.out.println(myCircleQueue.deQueue());
        System.out.println(myCircleQueue.Front());
        System.out.println(myCircleQueue.rear);
    }
}
相关推荐
fox_mt11 分钟前
AI Coding - ClaudeCode使用指南
java·ai编程
毕设源码-郭学长29 分钟前
【开题答辩全过程】以 基于SSM的高校运动会管理系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
qq_54702617931 分钟前
Maven 使用指南
java·maven
C++ 老炮儿的技术栈35 分钟前
什么是通信规约
开发语言·数据结构·c++·windows·算法·安全·链表
xiaolyuh12339 分钟前
Arthas修改类(如加日志)的实现原理
java
栗子叶43 分钟前
Java对象创建的过程
java·开发语言·jvm
有一个好名字1 小时前
力扣-从字符串中移除星号
java·算法·leetcode
萧瑟其中~1 小时前
二分算法模版——基础二分查找,左边界查找与右边界查找(Leetcode的二分查找、在排序数组中查找元素的第一个位置和最后一个位置)
数据结构·算法·leetcode
zfj3211 小时前
CyclicBarrier、CountDownLatch、Semaphore 各自的作用和用法区别
java·开发语言·countdownlatch·semaphore·cyclicbarrier
2501_916766541 小时前
【JVM】类的加载机制
java·jvm