【Java】使用`LinkedList`类来实现一个队列,并通过继承`AbstractQueue`或者实现`Queue`接口来实现自定义队列

使用LinkedList类来实现一个队列,并通过继承AbstractQueue或者实现Queue接口来实现自定义队列。

以下是一个简单的示例,其中队列的大小与另一个List的容量保持一致:

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class DynamicSizeQueue<T> extends AbstractQueue<T> {

    private Queue<T> queue;
    private List<?> list;

    public DynamicSizeQueue(List<?> list) {
        this.queue = new LinkedList<>();
        this.list = list;
    }

    @Override
    public boolean offer(T t) {
        if (list.size() == queue.size()) {
            return false; // 队列已满,无法添加新元素
        }
        return queue.offer(t);
    }

    @Override
    public T poll() {
        return queue.poll();
    }

    @Override
    public T peek() {
        return queue.peek();
    }

    @Override
    public int size() {
        return queue.size();
    }

    @Override
    public java.util.Iterator<T> iterator() {
        return queue.iterator();
    }
}

在这个示例中,我们创建了一个名为DynamicSizeQueue的类,它继承自AbstractQueue并持有一个LinkedList作为内部队列。在构造函数中,我们传入了另一个List作为参考,以便保持队列大小与该List的容量一致。

offer方法用于添加元素

在队列已满时返回falsepoll方法用于取出队首元素并删除,peek方法用于获取队首元素但不删除,size方法用于获取队列大小。我们还实现了iterator方法以支持遍历队列。
在Java中,offerpollpeekQueue接口中定义的方法,它们用于操作队列中的元素。

  1. offer方法用于向队列中添加一个元素,如果队列已满则返回false。其方法签名为boolean offer(E e),其中E是队列中存储的元素类型。示例代码如下:
Queue<Integer> queue = new LinkedList<>();
boolean result = queue.offer(5);
  1. poll方法用于获取并移除队列的头部元素,如果队列为空则返回null。其方法签名为E poll(),其中E是队列中存储的元素类型。示例代码如下:
Queue<Integer> queue = new LinkedList<>();
Integer result = queue.poll();
  1. peek方法用于获取队列的头部元素但不移除,如果队列为空则返回null。其方法签名为E peek(),其中E是队列中存储的元素类型。示例代码如下:
Queue<Integer> queue = new LinkedList<>();
Integer result = queue.peek();

总结:

  • offer用于添加元素到队列,如果队列已满则返回false
  • poll用于获取并移除队列头部的元素,如果队列为空则返回null
  • peek用于获取队列头部的元素但不移除,如果队列为空则返回null
    在Java中,如果您想要实现在添加新元素时挤出最旧的元素,您可以使用Queue接口的offerpoll方法来实现。通过在调用offer方法之后检查队列的大小,如果队列大小超过了您希望的大小,可以调用poll方法来移除最旧的元素。

调用poll方法移除最旧的元素。

使用offer方法添加新元素,poll方法获取并移除头部元素,peek方法获取头部元素但不移除,size方法获取队列大小。

public boolean offer(T element) {
        if (queue.size() >= maxSize) {
            queue.poll(); // 移除最旧的元素
        }
        return queue.offer(element); // 添加新元素
    }
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用LinkedList来模拟堆栈和队列的容器类实现: ```java import java.util.LinkedList; public class Container<T> { private LinkedList<T> list; public Container() { list = new LinkedList<>(); } // 堆栈操作,入栈 public void push(T item) { list.addFirst(item); } // 堆栈操作,出栈 public T pop() { if (list.isEmpty()) { throw new RuntimeException("Stack is empty"); } return list.removeFirst(); } // 堆栈操作,查看栈顶元素 public T peek() { if (list.isEmpty()) { throw new RuntimeException("Stack is empty"); } return list.getFirst(); } // 队列操作,入队 public void offer(T item) { list.addLast(item); } // 队列操作,出队 public T poll() { if (list.isEmpty()) { throw new RuntimeException("Queue is empty"); } return list.removeFirst(); } // 队列操作,查看队首元素 public T peekFirst() { if (list.isEmpty()) { throw new RuntimeException("Queue is empty"); } return list.getFirst(); } // 队列操作,查看队尾元素 public T peekLast() { if (list.isEmpty()) { throw new RuntimeException("Queue is empty"); } return list.getLast(); } // 返回容器大小 public int size() { return list.size(); } // 判断容器是否为空 public boolean isEmpty() { return list.isEmpty(); } } ``` 使用方法: ```java Container<Integer> stack = new Container<>(); stack.push(1); stack.push(2); stack.push(3); System.out.println(stack.pop()); // 输出 3 System.out.println(stack.pop()); // 输出 2 Container<String> queue = new Container<>(); queue.offer("a"); queue.offer("b"); queue.offer("c"); System.out.println(queue.poll()); // 输出 a System.out.println(queue.peekFirst()); // 输出 b System.out.println(queue.peekLast()); // 输出 c ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全面解读

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值