Java實現雙端佇列
阿新 • • 發佈:2019-01-01
雙端佇列
雙端佇列是指允許兩端都可以進行入隊和出隊操作的佇列,其元素的邏輯結構仍是線性結構。將佇列的兩端分別稱為前端和後端,兩端都可以入隊和出隊。
- 定義佇列介面
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