package com.gary.util;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
/**
* 固定长度队列
* @author gary
*
*/
public class LimitQueue<E> implements Queue<E>{
//队列长度
private int limit;
Queue<E> queue = new LinkedList<E>();
public LimitQueue(int limit){
this.limit = limit;
}
/**
* 入队
* @param e
*/
@Override
public boolean offer(E e){
if(queue.size() >= limit){
//如果超出长度,入队时,先出队
queue.poll();
}
return queue.offer(e);
}
/**
* 出队
* @return
*/
@Override
public E poll() {
return queue.poll();
}
/**
* 获取队列
* @return
*/
public Queue<E> getQueue(){
return queue;
}
/**
* 获取限制大小
* @return
*/
public int getLimit(){
return limit;
}
@Override
public boolean add(E e) {
return queue.add(e);
}
@Override
public E element() {
return queue.element();
}
@Override
public E peek() {
return queue.peek();
}
@Override
public boolean isEmpty() {
return queue.size() == 0 ? true : false;
}
@Override
public int size() {
return queue.size();
}
@Override
public E remove() {
return queue.remove();
}
@Override
public boolean addAll(Collection<? extends E> c) {
return queue.addAll(c);
}
@Override
public void clear() {
queue.clear();
}
@Override
public boolean contains(Object o) {
return queue.contains(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return queue.containsAll(c);
}
@Override
public Iterator<E> iterator() {
return queue.iterator();
}
@Override
public boolean remove(Object o) {
return queue.remove(o);
}
@Override
public boolean removeAll(Collection<?> c) {
return queue.removeAll(c);
}
@Override
public boolean retainAll(Collection<?> c) {
return queue.retainAll(c);
}
@Override
public Object[] toArray() {
return queue.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return queue.toArray(a);
}
}
test:
package com.gary.test;
import com.gary.util.LimitQueue;
public class TestQueue {
public static void main(String[] args) {
LimitQueue<String> lqueue = new LimitQueue<String>(3);
lqueue.offer("1");
lqueue.offer("2");
lqueue.offer("3");
lqueue.offer("4");
//1因超出队列大小限制已自动出队,输出结果为2,3,4
for (String string : lqueue.getQueue()) {
System.out.println(string);
}
}
}
分享到:
相关推荐
在主方法中,我们首先创建了一个`Queue`对象`Q`,然后通过用户输入确定队列长度,并依次向队列中添加元素。例如,向队列中添加“111”、“222”,之后执行一次出队操作,再添加“333”,最后再次执行出队操作直至...
优先级队列对c ++使用环形缓冲区,固定长度container :: RingQueue C ++的环形优先级队列。 具有类似STL的单头实现。 只需将其放入您的项目中即可。 不是线程安全的C ++ 11实现完全可移植自排序,例如std :: set基本...
以上内容展示了如何使用动态链接的方式实现队列,包括队列的基本操作如初始化、销毁、判断是否为空、获取长度以及获取队头元素等功能。这种方式相比于数组实现,更加灵活,适用于队列大小不固定的场景。
1. **初始化**:创建循环队列时,首先需要初始化队列的大小,通常是设定一个固定的数组长度。队头和队尾指针初始化为0,表示队列为空。 2. **入队(enqueue)**:当有新的元素要加入队列时,检查队列是否已满。计算...
在实际编程中,循环队列的实现通常包括一个结构体,包含了数组、头尾指针和队列容量这些成员变量,以及对应的初始化、入队、出队和求长度的方法。例如,Python 代码可能如下所示: ```python class CircularQueue: ...
4. 队列满和空的判断:对于固定大小的数组,队列满的条件通常是front == (rear + 1) % size,这里的size是数组的长度。队列空的条件是front == rear。 二、链表实现的队列 1. 结构定义:在链表实现中,每个元素...
在C#中,`Queue`本身并不直接支持固定长度,但可以通过自定义逻辑实现。当达到预设容量时,可以检查是否需要丢弃队尾元素或者阻止新的元素加入。以下是一个示例: ```csharp public class FixedSizeQueue<T>: ...
对于非循环队列,可以检查`rear`是否等于数组长度减一。 6. 队列扩容:当队列满时,可以创建一个更大的新数组,然后将旧数组中的元素复制到新数组中。 ### 链表实现队列 链表实现队列更加灵活,因为它的大小可以...
多级反馈队列调度算法的核心思想是将所有就绪进程按照一定的策略分配到不同的优先级队列中,并为每个队列设置不同的时间片长度。当一个进程在一个队列的时间片耗尽时,它会被移动到下一个较低优先级的队列中继续执行...
循环队列是一种线性数据结构,它在物理存储上表现为一个固定大小的数组,但在逻辑上,队头和队尾可以“循环”地移动,使得队列在满和空的状态下依然能有效地工作。这种数据结构常用于解决需要先进先出(FIFO)操作的...
在编程中,很多编程语言提供了内置的队列实现,如C++中的`std::queue`容器,Java的`java.util.Queue`接口,Python的`collections.deque`等。不过,了解底层的实现原理可以帮助我们更好地理解和优化代码。 总的来说...
在循环队列的实现中,我们通常使用一个固定大小的数组来存储元素。数组的索引视为虚拟的“位置”,0表示第一个元素,数组长度-1表示最后一个元素。循环队列的队头和队尾通过两个变量维护,分别是`front`和`rear`,...
在本压缩包中,提供了C、C++和Java三种编程语言实现顺序队列的源码,这对于理解和学习不同语言的数据结构实现非常有帮助。 1. **C语言实现** 在C语言中,顺序队列通常通过数组来实现。创建一个固定大小的数组,...
环形队列的实现通常基于一个固定大小的一维数组。它包含两个指针,一个表示队头(Front),一个表示队尾(Rear)。队头是元素被删除的位置,队尾是元素被添加的位置。当队列为空时,队头和队尾指向同一位置;当队列...
下面我们将详细讨论基数排序的原理、C++中的队列以及如何用C++的队列实现基数排序。 ### 1. 基数排序原理 基数排序的核心思想是从低位到高位进行排序,依次将每个位数上的元素分配到相应的位置,最后再按照位数...
5. 检查队列是否已满(is_full):对于固定大小的队列,如果队尾等于队列容量减一(在0-based索引下),队列已满;对于链表,无需检查是否已满,因为可以动态扩展。 6. 获取队列的当前长度(size):返回队列中元素...
在提供的"CycleBuffer"文件中,应该包含了具体的C++环形队列实现代码,通过阅读和理解这段代码,可以深入学习和掌握环形队列的内部工作原理和C++实现细节。对于进行通信开发的程序员来说,熟练掌握环形队列的使用是...
- 计算队列长度:遍历队列计算元素个数。 - 清空队列:释放所有元素,重置队头和队尾指针。 - 销毁队列:释放队列占用的内存。 - 遍历队列:按照FIFO顺序访问队列中的所有元素。 5. **代码和头文件**: "代码...
1. **顺序存储结构**:在顺序存储结构中,队列的元素按照它们进入的顺序依次存储在一个固定大小的数组里。数组的前端表示队头,后端表示队尾。在实际应用中,我们需要知道队头和队尾的位置,以便进行正确的入队和出...
- **数组实现**:用一个固定大小的数组存储元素,维护两个指针,一个指向队首,一个指向队尾。 - **链表实现**:创建一个节点类,包含数据和指向下一个节点的指针。队列的头部和尾部都是链表的头节点。 `main.cpp`...