資料結構4--佇列(java程式碼實現佇列的鏈式儲存)
阿新 • • 發佈:2018-11-14
1.什麼是佇列?
佇列也叫隊,時允許在一段進行擦汗如另一端進行刪除的運算受限的線性表。區別佇列和棧:棧時先進後出,佇列時先進先出。
2.順序佇列
佇列的順序儲存結構稱為順序佇列,可以做到不浪費地址空間
順序佇列使用front和rear兩個指標分別指向隊頭元素和隊尾元素的位置
入隊出隊的演示:
順序佇列的特點:
- 靜態分配儲存空間
- 入隊操作只能在隊尾,出隊操作只能在隊首
- 佇列為空時front=rear
- 佇列為滿時,rear=佇列的長度-1
- 佇列非空非滿時 front<rear<佇列的長度-1
選A
3.鏈式佇列(重點)
佇列的鏈式儲存結構稱為鏈式佇列
鏈式佇列的特點:
- 動態分配儲存空間
- 入隊操作在隊尾進行,出隊操作在隊頭進行
- 鏈式佇列在入隊時無隊滿的問題
- 鏈式佇列為空佇列的條件: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&¤t!=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