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

来源:互联网 发布:linux 打包一个文件夹 编辑:程序博客网 时间:2024/05/29 16:23

public classListQueue {

    static ListQueuelistfront;

    static int       front;

    static ListQueuelistrear;

    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=newint[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;

            returnlistfront.date[front];

        }

        else if(front==MaxSize-1&&listfront!=listrear){

            listfront=listfront.next;

            listrear.next=listfront;

            front=0;

            returnlistfront.date[front];

        }

        else{         //front==MaxSize-1&&listfront==listrear)

            front=0;

            returnlistfront.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]);

                returnlistfront.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]);

                returnlistfront.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 0