class Queue
{
private int maxSize;
private long[] queArray;
private int front;
private int rear;
private int nItems;
//--------------------------------------------------------------
public Queue(int s) // constructor
{
maxSize = s;
queArray = new long[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
//--------------------------------------------------------------
public void insert(long j) // put item at rear of queue
{
if(rear == maxSize-1) // deal with wraparound
rear = -1;
queArray[++rear] = j; // increment rear and insert
nItems++; // one more item
}
//--------------------------------------------------------------
public long remove() // take item from front of queue
{
long temp = queArray[front++]; // get value and incr front
if(front == maxSize) // deal with wraparound
front = 0;
nItems--; // one less item
return temp;
}
//--------------------------------------------------------------
public long peekFront() // peek at front of queue
{
return queArray[front];
}
//--------------------------------------------------------------
public boolean isEmpty() // true if queue is empty
{
return (nItems==0);
}
//--------------------------------------------------------------
public boolean isFull() // true if queue is full
{
return (nItems==maxSize);
}
//--------------------------------------------------------------
public int size() // number of items in queue
{
return nItems;
}
//--------------------------------------------------------------
} // end class Queue
class QueueApp
{
public static void main(String[] args)
{
Queue theQueue = new Queue(5); // queue holds 5 items
theQueue.insert(10); // insert 4 items
theQueue.insert(20);
theQueue.insert(30);
theQueue.insert(40);
theQueue.remove(); // remove 3 items
theQueue.remove(); // (10, 20, 30)
theQueue.remove();
theQueue.insert(50); // insert 4 more items
theQueue.insert(60); // (wraps around)
theQueue.insert(70);
theQueue.insert(80);
while( !theQueue.isEmpty() ) // remove and display
{ // all items
long n = theQueue.remove(); // (40, 50, 60, 70, 80)
System.out.print(n);
System.out.print(" ");
}
System.out.println("");
} // end main()
} // end class QueueApp
1、此为循环队列,队列中有nItems来记录当前队列中数据项的个数,这个会使insert和remove方法增加一点额外的操作,如果处理大量的插入和移除操作的话,就会影响性能。通过数据容量比队列项个数还要大一的方式来实现没有数据项计数的循环队列,这个属于典型的用空间复杂度来换取时间复杂度的方式,该队列在在满的情况下,永远有一个是空闲着的。
class Queue
{
private int maxSize;
private long[] queArray;
private int front;
private int rear;
//--------------------------------------------------------------
public Queue(int s) // constructor
{
//扩充+1的容量;
maxSize = s+1;
queArray = new long[maxSize];
front = 0;
rear = -1;
}
//--------------------------------------------------------------
public void insert(long j) // put item at rear of queue
{
if(rear == maxSize-1) // deal with wraparound
rear = -1;
queArray[++rear] = j; // increment rear and insert
}
//--------------------------------------------------------------
public long remove() // take item from front of queue
{
long temp = queArray[front++]; // get value and incr front
if(front == maxSize) // deal with wraparound
front = 0;
return temp;
}
//--------------------------------------------------------------
public long peekFront() // peek at front of queue
{
return queArray[front];
}
//--------------------------------------------------------------
//其实其他操作跟有nItems的都一样,扩充一的容量主要是为了方便时空是满的判
//断,这样满的情况是front和rear会有2的差距,而空的情况是1的差距
public boolean isEmpty() // true if queue is empty
{
return (rear+1==front||(front+maxSize-1)==rear);
}
//--------------------------------------------------------------
public boolean isFull() // true if queue is full
{
return (rear+2==front||(front+maxSize-2)==rear);
}
//--------------------------------------------------------------
public int size() // number of items in queue
{
if(rear>front){
return rear-front+1;
}else{
return (maxSize-front)+(rear+1) ;
}
}
}
2、双端队列
双端队列就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。如果禁止一端,双端队列就和栈一样。
3、优先级队列
优先级队列是根据关键字值的优先级有序存放的对队列,除了可以访问最优先关键字值的数据项外,优先级队列还应该可以实现相当快的插入速度,因此优先级队列通常是用堆的数据结构来实现的。
效率:用数组实现的话,插入操作需要O(N)的时间,删除需要O(1),可以通过堆来改进;