1. 程式人生 > >資料結構4--佇列(java程式碼實現佇列的鏈式儲存)

資料結構4--佇列(java程式碼實現佇列的鏈式儲存)

1.什麼是佇列?

     佇列也叫隊,時允許在一段進行擦汗如另一端進行刪除的運算受限的線性表。區別佇列和棧:棧時先進後出,佇列時先進先出。

                                           

2.順序佇列

    佇列的順序儲存結構稱為順序佇列,可以做到不浪費地址空間

    順序佇列使用front和rear兩個指標分別指向隊頭元素和隊尾元素的位置

   入隊出隊的演示:

                                                        

 順序佇列的特點:

  1.  靜態分配儲存空間
  2. 入隊操作只能在隊尾,出隊操作只能在隊首
  3. 佇列為空時front=rear
  4. 佇列為滿時,rear=佇列的長度-1
  5. 佇列非空非滿時 front<rear<佇列的長度-1

     

     選A

 3.鏈式佇列(重點)

    佇列的鏈式儲存結構稱為鏈式佇列

                                                    

    鏈式佇列的特點:

  1.     動態分配儲存空間
  2. 入隊操作在隊尾進行,出隊操作在隊頭進行
  3. 鏈式佇列在入隊時無隊滿的問題
  4. 鏈式佇列為空佇列的條件:front=rear

  4.java程式碼實現鏈式佇列

       底層使用WxLinkList實現,WxLinkList是由我自己實現的一個線性表的鏈式儲存,佇列也是在線性表的鏈式儲存的基礎上來的,但是這裡我修復了一個線性表的鏈式儲存的刪除元素的bug,之前沒有考慮到刪除頭節點的問題,所以我把修改後的刪除方法貼出來

      

/*
      指定刪除一個元素
     */
    @Override
    public void remove(T elementm) {
        Node node=new Node(elementm,null);
        //歷遍,判斷是否相等
        Node current=header;
        Node prenode=null;  //要刪除節點的上一個
        for (int i=0;i<size&&current!=null;i++,prenode=current,current=current.next)
        {
            if (node.getNodevalue().equals(current.getNodevalue()))
            {
                //如果刪除的時頭節點,prenode會為null;所以在這裡需要判斷,佇列在這裡透視需要彈出top的元素
                //當佇列中只有一個元素的時候current.next;會為null
                if(i==0&&size>1)
                {
                    //當前節點的下一個節點為頭節點
                    Node next = current.next;
                    header=next;
                    size--;
                }
                else if (i==0&&size==1)
                {
                    clear();
                }
                else {
                    Node nextnode=current.next;  //要刪除節點的下一個節點
                    prenode.next=nextnode;       //當前節點的指標域指向下一個節點就刪除了當前的節點
                    size--;
                }
            }
        }
    }

  接下來回到佇列上來,老規矩,首先實現佇列的基本操作介面:

package com.wx.datastructure.base;

public interface WxQueue {
    /*
      鏈式佇列的介面
     */
    public boolean isEmpty();//判斷佇列是否為空
    public int size();       //返回佇列的大小
    public void push(Object element); //將元素由隊尾壓入佇列
    public Object pop();     //彈出隊首的元素
    public Object peek();    //查詢隊首的元素
}

 然後實現介面的方法:
 

package com.wx.datastructure.imp;

import com.wx.datastructure.base.WxQueue;

import java.util.NoSuchElementException;

public class WxQueueImp implements WxQueue {
    /*
      實現佇列的介面方法
     */
    private WxLinkList linkList=null;
    public WxQueueImp()
    {
        linkList=new WxLinkList();
    }

    /*
      判斷佇列是否為空
     */
    @Override
    public boolean isEmpty() {
        return linkList.isEmpty();
    }
    /*
      返回佇列的大小
     */
    @Override
    public int size() {
        return linkList.size();
    }

    /*
      從隊尾壓入元素
     */
    @Override
    public void push(Object element) {
        linkList.addLast(element);
    }

    /*
        彈出隊首元素
     */
    @Override
    public Object pop() {
        if (linkList.isEmpty())
        {
            throw new NoSuchElementException("佇列為空");
        }
        Object o = linkList.get(0);
        linkList.remove(o);
        return o;
    }

    @Override
    public Object peek() {
        if (linkList.isEmpty())
        {
            throw new NoSuchElementException("佇列為空");
        }
        return linkList.get(0);
    }
}

 測試:
 

package com.wx.datastructure.test;

import com.wx.datastructure.base.WxQueue;
import com.wx.datastructure.imp.WxQueueImp;

import java.util.Scanner;

public class TestWxQueue {
    /*
    測試WxQueue
     */
    public static void main (String[] args)
    {
        WxQueue wxQueue=new WxQueueImp();
        Scanner input =new Scanner(System.in);
        System.out.print("輸入壓入佇列的元素,輸入quit表示離開:");
        String element=input.next();
        while (!element.equals("quit"))
        {
            wxQueue.push(element);
            element=input.next();
        }
        while (!wxQueue.isEmpty())
        {
            System.out.print("    ");
            System.out.print(wxQueue.pop());
        }
    }
}

 

  測試的結果,果然是先進先出的序列:

 

 

至於佇列的線性儲存的實現,底層可以選用我寫的線性表的順序儲存然後參照本篇部落格來實現

不說了,本篇部落格程式碼地址:https://github.com/WangAlainDelon/DataStructure4.git