1. 程式人生 > >動態連結串列佇列--記憶體溢位異常-和邊界溢位

動態連結串列佇列--記憶體溢位異常-和邊界溢位

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

    }

}