队列的实现
Posted ServerSocket
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列的实现相关的知识,希望对你有一定的参考价值。
首先来了解下队列的特点:
First in First out: 先进先出
在对列中有两种存储方式
其一是按顺序存储,也就是用数组进行存储
其二是按链式存储,也就是按链表来进行存储
其一:
public class CirQueue<E> { //对象数组,队列最多存储a.length-1个对象 E[] a; //默认初始化大小 private static final int DEFAULT_SIZE=10; //对首下标 int front; //队尾下标 int rear; public CirQueue(){ this(DEFAULT_SIZE); } /** * 初始化指定长度的队列 * @param size */ @SuppressWarnings("unchecked") public CirQueue(int size){ a=(E[])(new Object[size]); front=0; rear=0; } /** * 将一个对象追加到队列尾部 * @param obj * @return 队列满时返回false,否则返回true * @author yaobo */ public boolean enqueue(E obj){ if((rear+1)%a.length==front){ return false; }else{ a[rear]=obj; rear=(rear+1)%a.length; return true; } } /** * 队列头部出队 * @return * @author yaobo */ public E dequeue(){ if(rear==front) return null; else{ E obj =a[front]; front=(front+1)%a.length; return obj; } } //队列长度 public int length(){ if(rear>front){ return rear-front; }else return a.length-1; } /** * 判断是否为空 * @return * @author yaobo */ public boolean isEmpty(){ return rear==front; } public String toString(){ StringBuffer sb=new StringBuffer(); sb.append("["); for(int i=front;i<rear;i++){ if(a[i]!=null){ sb.append(a[i]+","); } } sb.delete(sb.length()-1, sb.length()); sb.append("]"); return sb.toString(); } public static void main(String[] args) { CirQueue<String> queue=new CirQueue<String>(7); queue.enqueue("1"); queue.enqueue("2"); queue.enqueue("3"); queue.enqueue("4"); queue.enqueue("5"); System.out.println(queue); System.out.println("size="+queue.length()); int size=queue.length(); System.out.println("*******出栈操作*******"); for(int i=0; i<size;i++){ System.out.println("size="+queue.length()); System.out.println(queue.dequeue()+" "); System.out.println(queue); } } }
其二:
/* * 链式存储队列 */ public class LinkQueue<T> { //创建一个链表结构 private class Node{ public T data ; public Node next; //创建无参构造方法 public Node(){ } Node(T data,Node next){ this.data=data; this.next=next; } } private Node front; private Node rear; private int size; //构造方法,创建队列 public LinkQueue(){ front=new Node(null,null); rear=new Node(null,null); front=rear; size=0; } //入队列操作 public void Enqueue(T data){ Node d=new Node(data,null); rear.next=d; rear=d; size++; } //出队列操作 public T DeQueue(){ if(rear==front){ return null; } Node p=new Node(null,null); p=front.next; T data=p.data; if(p.next==null){ rear=front; } front.next=p.next; p=null; size--; return data; } //判断长度 public int Size(){ return size; } //判断是否为空 public boolean isEmpty(){ if(rear==front){ return true; } return false; } public String toString() { if(isEmpty()){ return "[]"; }else{ StringBuilder sb = new StringBuilder("["); for(Node current=front.next;current!=null;current=current.next){ sb.append(current.data.toString() + ", "); } int len = sb.length(); return sb.delete(len - 2, len).append("]").toString(); } } public static void main(String arg[]){ LinkQueue queue=new LinkQueue(); queue.Enqueue(1); queue.Enqueue(2); queue.Enqueue(3); queue.Enqueue(4); System.out.println(queue); System.out.println("队列长度:"+queue.Size()); System.out.println("出队:"+queue.DeQueue()); System.out.println("队列长度="+queue.Size()); System.out.println(queue); System.out.println("出队:"+queue.DeQueue()); System.out.println("队列长度="+queue.Size()); System.out.println(queue); System.out.println("出队:"+queue.DeQueue()); System.out.println("队列长度="+queue.Size()); System.out.println(queue); } }
以上是关于队列的实现的主要内容,如果未能解决你的问题,请参考以下文章