队列:队尾插入,队头删除的线性表。
顺序队列:用一组地址连续的存储单元依次存放从队头到队尾的元素,定义front和rear分别指示队列的队头元素和队尾元素。
链式队列:用一组任意的的存储单元依次存放从队头到队尾的元素,定义front和rear分别指示队列的队头元素和队尾元素。
入队
rear=(rear+1)%queueArray.length;
queueArray[rear]=obj;
出队
front=(front+1)%queueArray.length;
return queueArray[front];
判空
rear= =front
判满
(rear+1)%queueArray.length= =front
什么是“假溢出” ?如何解决?
在顺序队列中,当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。解决假溢出的途径———采用循环队列
应用场景1.模拟服务前台的排队现象
假设只有一个窗口,一个业务人员,要求程序模拟统计在设定的时间内,业务人员的总空余时间和客户的平均等待时间。每位客户有两个数据,到达时间和需要办理业务的时间。
package codefile;
import java.util.Scanner;
class QNode{
//成员变量
int arrive;
int treat;
//构造方法
QNode(int a,int t){
arrive=a;
treat=t;
}
}
class sequenceQuence<T>{
T quence[];
int front;
int rear;
sequenceQuence(){
quence=(T[])new Object[20];
front=rear=0;
}
void enQuence(T obj){
rear=(rear+1)%quence.length;
quence[rear]=obj;
}
boolean isEmpty(){
if(rear==front){
return true;
}else{
return false;
}
}
T deQuence(){
if(! isEmpty()){
front=(front+1)%quence.length;
return quence[front];
}else{
return null;
}
}
}
public class Second {
public static void main(String[] args) {
int dwait=0,clock=0,wait=0,finish;
QNode curr,temp;
int arrtime[]={1,3,5,11,56,89};
int tretime[]={11,3,1,4,66,22};
int i=0;
sequenceQuence<QNode> wa=new sequenceQuence<QNode>();
temp=new QNode(arrtime[i],tretime[i]);
while(! wa.isEmpty()||i<arrtime.length){
if(wa.isEmpty()&&i<arrtime.length){
dwait+=temp.arrive-clock;
clock=temp.arrive;
wa.enQuence(temp);
i++;
if(i<arrtime.length){
temp=new QNode(arrtime[i],tretime[i]);
}
}
curr=wa.deQuence();
wait+=clock-curr.arrive;
finish=clock+curr.treat;
i++;
while(i<arrtime.length&&temp.arrive<=finish){
wa.enQuence(temp);
temp=new QNode(arrtime[i],tretime[i]);
i++;
}
clock=finish;
}
System.out.println("业务员等待时间 客户平均等待时间");
System.out.println(dwait+" "+(double)wait/arrtime.length);
System.out.println("模拟总时间 客户人数 总等待时间");
System.out.println(clock+" "+arrtime.length+" "+wait);
}
}
执行结果