public classListQueue {
static ListQueue listfront;
static int front;
static ListQueue listrear;
static int rear;
static{ //最初建立头队列节点
listfront=listrear=new ListQueue();
rear=0;
front=0;
}
// member of no-static
int[] date;
static final int MaxSize=100;
ListQueuenext;
public ListQueue(){
date=new int[MaxSize];
}
public void insertnumber(int number){
if(rear<(MaxSize-1)&&rear+1!=front){ //listrear尾节点索引的节点中还有空余内存存储数据
rear=rear+1;
listrear.date[rear]=number;
// System.out.println(listrear.date[rear]);
}
else if((rear==(MaxSize-1))&&(front==0)){ //listfront头结点索引的节点没有空余内存
listrear.next=new ListQueue();
listrear=listrear.next;
listrear.next=listfront; //insert numberto rear.date;
rear=0;
listrear.date[rear]=number;
// System.out.println(listrear.date[rear]);
}
else if(rear==(MaxSize-1)&&front!=0){ //头结点中还有空余内存存储数据
listrear=listfront; //move list-rear,attention to that rear should be zero;
rear=0;
listrear.date[rear]=number;
// System.out.println(listrear.date[rear]);
}
else if((rear+1)==front&&listfront==listrear){ //在数组的中间出现队列满的情况
listfront=listrear.next;
listrear.next=new ListQueue();
listrear.next.next=listfront;
listfront=listrear.next; //申请一个新的头结点
for(int count=MaxSize-1;count>front;count--){ //讲原先头结点的数据复制到新的头结点中
listfront.date[count]=listrear.date[count];
}
rear=rear+1;
listrear.date[rear]=number;
// System.out.println(listrear.date[rear]);
}
}
intgetanddeletenumber(){ //和getnumber相同,主要区别在于front会向前移动达到对数据的删除操作
if(front==rear&&listfront==listrear){
//throw exception of empty queue
return 0;
}
if(front<MaxSize-1){
front=front+1;
return listfront.date[front];
}
else if(front==MaxSize-1&&listfront!=listrear){
listfront=listfront.next;
listrear.next=listfront;
front=0;
return listfront.date[front];
}
else{ //front==MaxSize-1&&listfront==listrear)
front=0;
return listfront.date[0];
}
}
int getnumber(){
if(front==rear&&listfront==listrear){ //空队列的判定
System.out.println("exception");
return 0;
//exception of empty queue;
}
else{ //为非空队列
if(front<MaxSize-1){ //头索引的下表不在节点数组的尾部,
// System.out.println(listfront.date[front+1]);
return listfront.date[front+1];
}
else if(front==MaxSize-1&&listfront!=listrear){ //遍历下个节点
ListQueuelistmid=listfront.next;
// System.out.println(listmid.date[0]);
return listmid.date[0];
}
else{ //(front==MaxSize-1&&listfront==listrear) //同一个节点的遍历
// System.out.println(listfront.date[0]);
return listfront.date[0];
}
}
}
void showalldate(){
if(front==rear&&listfront==listrear){ //判定是否为空队列
System.out.println("empty Queue");
//**
// 注意这里需要调用跑出个错误, 不是异常
}
else{
int mid=front+1; //遍历不能破坏原本的索引,需要额外的索引
ListQueuelistmid=listfront;
while(!(listmid==listrear&&mid==rear+1)){
if(listmid!=listrear){ //有多个节点队列的遍历
for(;mid<MaxSize;mid++){
System.out.println(listmid.date[mid]);
}
listmid=listmid.next;
mid=0;
}
else{ //只有一个节点的时候的遍历
for(;mid<=rear;mid++){
System.out.println(listmid.date[mid]);
}
}
}
}
}
}
public classhellojava {
public static void main(String[]args){
ListQueuemyqueue=newListQueue();
for(inti=88;i<321;i++){
myqueue.insertnumber(i);
}
myqueue.getnumber();
myqueue.showalldate();
}
}