//用双端链表实现队列
/**
* 节点类
*/
class LinkQ {
private long data;
public LinkQ next;
public LinkQ(long d) {
this.data = d;
}
public String toString() {
return String.valueOf(this.data);
}
}
/**
* 双端链表类
*/
class FirstLastLink {
private LinkQ first;
private LinkQ last;
public FirstLastLink() {
first = null;
last = null;
}
public boolean isEmpty() {
return first == null;
}
public void insertLast(LinkQ l) {
if (isEmpty())
first = l;
else
last.next = l;
last = l;
}
public LinkQ deleteFirst() {
LinkQ temp = first;
if (first.next == null)
last = null;
first = first.next;
return temp;
}
@Override
public String toString() {
if (isEmpty())
return "[]";
LinkQ curr = first;
StringBuilder sb = new StringBuilder();
sb.append("[");
while (curr != null) {
sb.append(curr.toString()).append(",");
curr = curr.next;
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
return sb.toString();
}
public void display() {
System.out.println(toString());
}
}
/**
* 队列类
* 和上个例子的栈类的实现一样,都是强调概念上的实体,独立于它们的具体实现。
* 用数组或是链表实现栈和队列都是一样的。栈的重要性是它的push pop操作,以及如何使用它们;队列的重要性是从队头移除,从队尾插入,以及如何使用。
* 实现这些操作的内在机制从其重要性上讲,其实是不重要的。
*/
class LinkQueue{
private FirstLastLink link;
public LinkQueue(){
link = new FirstLastLink();
}
public boolean isEmpty(){
return this.link.isEmpty();
}
public void insert(LinkQ l){
this.link.insertLast(l);
}
public LinkQ remove(){
return this.link.deleteFirst();
}
public String toString(){
return this.link.toString();
}
public void display(){
System.out.println(toString());
}
}
public class LinkQueueDemo {
public static void main(String[] args) {
LinkQueue queue = new LinkQueue();
for (int i = 0; i < 5; i++) {
LinkQ l= new LinkQ(i);
queue.insert(l);
queue.display();
}
while(!queue.isEmpty()){
System.out.print("移除元素:"+queue.remove());
System.out.print(".现在队列为: ");
queue.display();
}
}
}
《Java数据结构与算法》笔记-CH5-链表-5用双端链表实现队列
最新推荐文章于 2021-07-26 20:07:38 发布