动态链表队列--内存溢出异常-和边界溢出

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();

    }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值