java算法,队列为空和已满?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java算法,队列为空和已满?相关的知识,希望对你有一定的参考价值。
下面代码中,为空和已满,什么意思?为什么那么表示?
public class Queue
private int maxSize;
private long[] queArray;
private int front;
private int rear;
public Queue(int s)
maxSize=s+1;
queArray=new long[maxSize];
front=0;
rear=-1;
public void insert(long j)
if(rear==(maxSize-1))
rear=-1;
queArray[++rear]=j;
public long remove()
if(front==maxSize-1)
front=0;
return queArray[front++];
public long peek()
return queArray[front];
public boolean isEmpty()
return (rear+1==front)||(front+maxSize-1==rear);
public boolean isFull()
return (rear+2==front)||(front+maxSize-2==rear);;
public int size()
return nItems;
ps:我想问问,怎么保持始终有一个为空,插入时,不都插进去了吗?也没有空值呀!
队列有个特点,先进先出.
front和rear可以看到两个标记 fornt 是指最选进入的那个,rear是指最后入队的那个
当 最后一个=最前一个那就是空
当最后一个的下一个=最前一个那就是满了,这很好理解呀,后面两个条件,你可以自己去推一下
还有疑问 shmilyhe@163.com
blog.csdn.net/shmilyhe 参考技术B 空
Size fornt rear
9 0 -1
| |
--------------------
| |
--------------------
有数据:
Size fornt(rear)
9 0
| |
--------------------
| *
--------------------
有数据:
Size rear fornt
9 2 0
| | |
--------------------
| * * *
--------------------
满:
Size(rear) fornt
9 0
| |
--------------------
|* * * * * * * * * *
-------------------- 参考技术C ==========================应你所邀前来作答============================
显然这是个循环队列。循环队列除了普通队列的FIFO特点以外,还有已经出队列后空闲的空间可以再次利用存储后续数据。
但因为有这个特点,根据进队列和出队列的次序,会产生这样的情况:队列空时和队列满时,队列首尾指针rear、front情况完全相同。所以,无法直接判断队列空还是满。
解决方法有两种:
一种是额外设置一个booean型变量,标识是否是空。
进队列时,将它置为true。出队列时,如发生上面指针情况,将它置false。
那么检查队列空或满就是对这个辅助变量与指针情况共同判断。
另一种方法是永远保留一个空闲位置。这样空和满的时候,两个指针的情况就不一样了。
你的这个程序是后一种处理方式。
至于将指针情况定义为什么关系表示空满,各人有各人的方法。
看一下我做的循环队列类,稍有变化。
public class Quque
private capacity,front,rear;
private long[] data;
public Queue(int size)
capacity=size+1;
data=new long[capacity];
front=rear=0;
public void enQueue(long value)
if((rear+1)%capacity==front)
throw new Exception("队列满");
data[rear++]=value;
rear%=capacity;
public long deQueue()
if(rear==front)
throw new Exception("队列空");
long value=data[front++];
front%=capacity;
return value;
public long peek()
if(rear==front)
throw new Exception("队列空");
return data[front];
public boolean isEmpty()
return rear==front;
public boolean isFull()
return (rear+1)%capacity==front;
public int getCapacity()
return capacity-1;
public int getSize()
return (rear+capacity-front)%capacity-1;
本回答被提问者采纳 参考技术D 没看出来吗,这是一个环形对列。-1与maxSize-1是重合的.
python 队列
一、分类
1、Queue()
# Queue 先进先出 import queue q = queue.Queue() q.put(‘a‘) # 向队列里添加数据,若队列已满,则阻塞 q.put_nowait(‘c‘) # 添加数据,若队列已满,则报错 q.get() # 从队列里取数据,若队列为空,则阻塞 q.get_nowait() # 从队列里取数据。若队列为空。则报错 q.empty() # 判断队列是否为空 q.full() # 判断队列是否满
2、LifoQueue()
import queue # 先进后出 # 方法一样 q = queue.LifoQueue() q.get() q.put() q.get_nowait() q.put_nowait() q.empty() q.full()
3、PriorityQueue()
import queue # 按优先级取值,put的是tuple,第一个元素是顺序,若不是数字,则安装编码比较 q = queue.PriorityQueue() q.put((10, ‘q‘)) q.put((5, ‘a‘)) print(q.get()) # 结果:(5, ‘a‘)
以上是关于java算法,队列为空和已满?的主要内容,如果未能解决你的问题,请参考以下文章
以标志变量flag作为判断循环队列空或满的依据,写出循环队列中插入和删除的算法。
Java数据结构及算法实战系列008:Java队列02——阻塞队列BlockingQueue