1. 程式人生 > >Java實現雙端佇列

Java實現雙端佇列

雙端佇列

雙端佇列是指允許兩端都可以進行入隊和出隊操作的佇列,其元素的邏輯結構仍是線性結構。將佇列的兩端分別稱為前端和後端,兩端都可以入隊和出隊。

  • 定義佇列介面
package com.feifan;

/**
 * 佇列的基本方法
 * @author Donald
 * 2018-12-06 22:45:04 
 * @param <T>
 */
public interface DoubleQueInterface <T> {
    //佇列頭部增加元素
    public void addFrist(T newEntry);
    //佇列頭部移除元素
public T removeFrist(); //佇列尾部增加元素 public void addLast(T newEntry); //佇列尾部移除元素 public T removeLast(); //佇列是否為空 public boolean isEmpty(); //佇列中元素的個數 public int size(); //清空佇列 public void clear(); //對列頭部遍歷佇列 public void foreachFrist(); //對列尾部遍歷佇列 public void
foreachLast(); }
  • 佇列實現類
package com.feifan;

import java.io.Serializable;

public class DoubleQueueImpl<T> implements DoubleQueInterface<T> {
	
	//佇列的長度
	private int size;
	//隊首
	private NodeData headNode;
	//隊尾
	private NodeData tailNode;
	
	public DoubleQueueImpl() {
		this.size =
0; this.headNode = null; this.tailNode = null; } //連結串列 private class NodeData implements Serializable{ private static final long serialVersionUID = 1L; //資料 private T data; //頭節點 private NodeData front; //尾節點 private NodeData next; public NodeData(T data, DoubleQueueImpl<T>.NodeData front, DoubleQueueImpl<T>.NodeData next) { super(); this.data = data; this.front = front; this.next = next; } public T getData() { return data; } public void setData(T data) { this.data = data; } public NodeData getFront() { return front; } public void setFront(NodeData front) { this.front = front; } public NodeData getNext() { return next; } public void setNext(NodeData next) { this.next = next; } } /** * 隊頭增加元素 */ @Override public void addFrist(T newEntry) { NodeData node= new NodeData(newEntry, null, headNode); if(isEmpty()) { tailNode=node; }else { headNode.setFront(node); } headNode=node; size++; } /** * 移除頭元素 */ @Override public T removeFrist() { T target=null; if(!isEmpty()) { target=headNode.getData(); headNode=headNode.getNext(); if(headNode==null) { tailNode=null; } size--; } return target; } /** * 隊尾增加元素 */ @Override public void addLast(T newEntry) { NodeData nodeData = new NodeData(newEntry, tailNode, null); if(isEmpty()) { tailNode=nodeData; }else { tailNode.setNext(nodeData); tailNode=nodeData; } size++; } /** * 移除隊尾元素 */ @Override public T removeLast() { T target=null; if(!isEmpty()) { target=tailNode.getData(); tailNode=tailNode.getFront(); if(tailNode==null) { headNode=null; } size--; } return target; } /** * 判斷佇列是否為空 */ @Override public boolean isEmpty() { return size>0?false:true; } /** * 佇列長度 */ @Override public int size() { return size; } /** * 清除佇列 */ @Override public void clear() { headNode=null; tailNode=null; size=0; } /** * 隊首迴圈遍歷佇列 */ @Override public void foreachFrist() { if(isEmpty()) { throw new RuntimeException("當前佇列為空"); }else { int temp=size; while(temp>0) { System.out.print(headNode.getData()+"\t"); addLast(removeFrist()); temp--; } System.out.println("======佇列正序遍歷完成======"); } } /** * 隊尾迴圈遍歷佇列 */ @Override public void foreachLast() { if(isEmpty()) { throw new RuntimeException("當前佇列為空"); }else { int temp =size; while(temp>0) { System.out.print(tailNode.getData()+"\t"); addFrist(removeLast()); temp--; } System.out.println("======佇列倒序遍歷完成======"); } } }

測試方法

package com.feifan;

public class DoubleQueTest {
	public static void main(String[] args) {
		DoubleQueueImpl< Integer> duQue= new DoubleQueueImpl<>();
		duQue.addFrist(1);
		duQue.addFrist(2);
		duQue.addLast(3);
		duQue.addLast(4);
		System.out.println(duQue.size());
		duQue.foreachFrist();
		duQue.foreachLast();
		duQue.removeFrist();
		duQue.removeLast();
		System.out.println(duQue.size());
		duQue.foreachFrist();
		duQue.foreachLast();
		
	}

}

  • 結果:
    在這裡插入圖片描述

僅供參考

連結:https://pan.baidu.com/s/1eR7yWVv_ZdX-U4mKLo2Zrg
提取碼:a75w