目录
一、双端队列的定义
双端队列(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双端队列的队首和队尾都满足栈先进后出的原则。它队首和队尾都支持入队和出队的操作。
双端队列图:
二、双端队列代码实现
注意:从双端队列图可以看出不管是队头还是队尾都符合栈先进后出的原则。
1、定义节点
public class Node{
private String element;
private Node prev;
private Node next;
Node(Node prev,String element,Node next) {
this.prev =prev;
this.element=element;
this.next=next;
}
}
private Node first;//第一个节点
private Node last;//最后一个节点
2、队首入队
public void First_Push(String elem) {
Node firsts=first;//将首节点赋值给firsts
Node node=new Node(null,elem,firsts);//调用node创建新节点
first=node;//新节点赋值给第一个节点
if(firsts == null) {//判断首节点是否是null如果是就把新节点赋值给尾节点
last=node;
}else {//首节点非空则把首节点的前指针指向新创建的节点实现队首插入的效果
firsts.prev=node;
}
}
3、队尾入队
public void Last_Push(String elem) {
Node lasts=last;//将尾节点赋值给lasts
Node node = new Node(lasts,elem,null);//调用node创建新节点
last =node;//新节点赋值给最后一个节点
if(lasts == null) {//判断尾节点是否是null如果是就把新节点赋值给首节点
first=node;
}else {//尾节点非空则把尾节点的后指针指向新创建的节点实现队尾插入的效果
lasts.next = node;
}
}
4、队首出队
public String First_Pop() {
if(first == null)return null;//如果队首是空则表示该队列没有任何数据返回null
Node firsts =first;//将第一个节点赋值给firsts
String element =firsts.element;//将第一个节点的数据赋值给element
Node next = firsts.next;//将第一个节点的下一位赋值给next节点
firsts.element = null;
firsts.next = null;
first=next;//将下一个节点赋值给第一个节点实现出队的效果
if (next == null)//如果下一个节点是空则直接将最后一个节点赋值为null
last = null;
else
next.prev = null;//如果下一个节点非空,则把该节点前指针指向null
return element;
}
5、队尾出队
public String Lats_Pop() {
if (last == null) return null;//如果队尾是空则表示该队列没有任何数据返回null
Node lasts = last;//将最后一个节点赋值给lasts
String element = lasts.element;//将最后一个节点的数据赋值给element
Node prev = lasts.prev;
lasts.element = null;
lasts.prev = null;
last = prev;//将前一个节点赋值给最后一个节点实现出队的效果
if (prev == null)//如果前一个节点是空则直接将第一个节点赋值为null
first = null;
else
prev.next = null;//如果前一个节点非空,则把该节点后指针指向null
return element;
}
6、输出队列
public void print() {
Node firsts =first;
while (firsts !=null){
System.out.print(firsts.element);
if(firsts.next!=null)System.out.print("->");
firsts = firsts.next;
}
}
7、主函数
public static void main(String[] args) {
DoubleEndsQueue deq = new DoubleEndsQueue();
deq.First_Push("1");
deq.Last_Push("3");
deq.First_Push("2");
deq.First_Push("5");
System.out.print("入队之后的队列:");
deq.print();
System.out.println();
String pop=deq.First_Pop();
System.out.println("弹出"+pop);
deq.print();
}
8、最终效果展示