양방향 순차 큐 어레이 어드레 및 양방향 체인 큐 링크드리스트, JDK가 포함되어 있으며 여기에 생략되었습니다. Arraydeque는 순차적 인 스택 및 순차 대기열이 포함되어 있으며 LinkedList에는 체인 스택 및 체인 큐가 포함되어 있습니다. Arraydeque와 LinkedList는 모두 스레드 정보 안전입니다. Priorityqueue Priority 대기열도 JDK에 있습니다.
1. 순차 대기열의 구현
패키지 lang; import java.io.serializable; import java.util.arrays;/** * @classname : arrayqueue * @description : 순차 대기열 * @date 2014 년 1 월 20 일 오후 3:46:19 pm * @param <t> */public class arrayqueue <t> serializable : @fields SerialiUD : 정적 최종 Long SerialVersionUID = 7333344126529379197L; 개인 int default_size = 10; 비공개 int 용량; // 배열의 길이를 저장 개인 개체 [] elementData; // 순차 대기열의 요소를 저장하기 위해 배열을 정의합니다. private int front = 0; // fleet head private int rear = 0; // 터미널 팀 // 빈 순차적 큐 공개 arrayqueue () {cappart = default_size; elementData = 새로운 객체 [용량]; } // 순차적 큐 생성 public arrayqueue (t element) {this (); ElementData [0] = 요소; 리어 ++; } public arrayqueue (int initsize) {elementData = new Object [initsize]; } / *** 지정된 길이 배열로 주문 큐 생성* @param 요소 순서 대기열의 첫 번째 요소* @param initsize 주문 큐* / public arrayqueue (t 요소, intsize) {this.capacity = initsize; elementData = 새로운 객체 [용량]; ElementData [0] = 요소; 리어 ++; } / ** * @title : size * @description : 순차 대기열의 크기를 가져옵니다 * @return * / public int size () {return 뒷면 - 전면; } / ** * @title : 제안 * @description : enqueue * @param element * / public void 제안 (t 요소) {ensurecapacity (rear + 1); ElementData [rear ++] = 요소; } private void ensurecapicative (int mincapacity) {// 배열의 원래 길이가 현재 필요한 길이보다 작은 경우 int oldcapacity = elementData.length; if (minCapacity> OldCapacity) {int newCapacity = (OldCapacity * 3) / 2 + 1; if (newCapacity <mincapacity) newCapacity = mincapacity; // mincapacity는 일반적으로 크기에 가깝기 때문에 이것은 다음과 같습니다. elementData = arrays.copyof (elementData, newCapacity); }} / ** * @title : poll * @description : dequeue * @return * / public t poll () {if (isempty ()) {throw new indexoutofBoundSexception ( "빈 큐 예외"); } // 대기열의 전면 끝에있는 요소의 값을 유지합니다. t OldValue = (t) ElementData [Front]; // 큐 요소의 전면 끝에있는 요소를 해제하십시오. [front ++] = null; OldValue를 반환하십시오. } / ** * @title : peek * @description : 큐의 상단 요소를 반환하지만 큐의 상단 요소를 삭제하지는 않습니다. } return (t) ElementData [Front]; } / ** * @title : isempty * @description : 주문 큐가 빈 큐 * @return * / public boolean isempty () {return rear == front; } / *** @title : clear* @description : 순서 대기열을 지우십시오* / public void clear () {// 기본 배열의 모든 요소를 null arrays.fill (elementData, null)에 할당합니다. 전면 = 0; 후면 = 0; } public String toString () {if (isempty ()) {return "[]"; } else {StringBuilder sb = new StringBuilder ( "["); for (int i = front; i <rear; i ++) {sb.append (elementData [i] .toString ()+","); } int len = sb.length (); sb.delete (len -2, len) .append ( "]"). tostring (); }}}2. 체인 큐의 구현
패키지 lang; import java.io.serializable;/** * @classname : linkqueue * @description : 체인 큐 * @date 2014 년 1 월 21 일 오후 3:24:38 pm * @param <t> */public class linkqueue <t> Serializable을 구현합니다. -6726728595616312615L; // 내부 클래스 노드를 정의하고 노드 인스턴스는 체인 큐의 노드를 나타냅니다. 개인 클래스 노드 {private t data; // 노드 개인 노드의 데이터 저장 다음; // 매개 변수가없는 다음 노드를 참조하십시오. public node () {} // 모든 속성을 초기화하기위한 생성자 공개 노드 (t data, node next) {this.data = data; this.next = 다음; }} 개인 노드 전면; // 체인 큐 개인 노드 후면의 헤드 노드 저장; // 체인 큐의 테일 노드를 저장 개인 큐브 삽입 크기를 저장하십시오. 전면 = null; 뒷면 = null; }/** * <p> 제목 : linkqueue </p> * <p> 설명 : 체인 큐에 하나의 요소 만있는 데이터 요소를 지정하여 체인 큐를 만듭니다. </p> */public linkqueue (t element) {front = new Node (emeter, null); // 노드 후면의 전면 및 후면 포인트가 하나만 있습니다. 크기 ++; } / ** * @title : size * @description : 순차 대기열의 크기를 가져옵니다 * @return * / public int size () {return size; } /** * @title : 제안 * @description : enqueue * @param element * /public void 제안 (t element) {// 체인 큐가 여전히 빈 체인 큐인 경우 (front == null) {front = new Node (요소, null); 후면 = 전면; // 노드에 대한 전면 및 후면 포인트는 하나뿐입니다.} else {node newnode = new Node (element, null); // 새 노드를 만듭니다 .next = newNode; // 새로 추가 된 노드의 다음 포인트를 후면을 새로 추가하여 새 노드를 새 테일 노드} 크기 ++로 가져 가게합니다. } / ** * @title : poll * @description : dequeue * @return * / public t poll () {Node OldFront = Front; Front = front.next; oldfront.next = null; 크기--; oldfront.data를 반환합니다. } / ** * @title : peek * @description : 큐의 상단 요소를 반환하지만 큐의 상단 요소를 삭제하지 않으면 * @return * / public t peek () {return rear.data; } / ** * @title : isempty * @description : 주문 큐가 빈 큐 * @return * / public boolean isempty () {return size == 0; } / *** @title : clear* @description : 순서 대기열을 지우십시오* / public void clear () {// 전면 및 후면 노드를 null front = null로 할당합니다. 뒷면 = null; 크기 = 0; } public String toString () {// 체인 큐가 빈 체인 큐인 경우 if (isempty ()) {return "[]"; } else {StringBuilder sb = new StringBuilder ( "["); for (node current = frant; current! = null; current.next) {sb.append (current.data.toString () + ","); } int len = sb.length (); sb.delete (len -2, len) .append ( "]"). tostring (); }} public static void main (String [] args) {linkqueue <string> queue = new Linkqueue <string> ( "aaaa"); // 두 개의 요소 추가 queue.offer ( "bbbb"); queue.offer ( "CCCC"); System.out.println (대기열); // 요소를 삭제 한 후 croute queue.poll (); System.out.println ( "요소 다음 큐 삭제 :" + 큐); // 요소를 다시 queue.offer ( "dddd") 추가합니다. System.out.println ( "요소 후에 큐를 다시 추가 :" + 큐); // 요소를 다시 추가 queue.poll (); // 요소를 다시 추가합니다 queue.offer ( "eeee"); System.out.println (대기열); }}3. 원형 대기열의 구현
패키지 lang; import java.io.serializable; import java.util.arrays;/** * @classname : loopqueue * @description : loopqueue * @date 2014 년 1 월 20 일 오후 3:47:14 pm */public class loopqueue <t> Serializable 구현 {/** @fields SerialDs : to onto ** @fields SerialiD. SerialVersionUid = -3670496550272478781L; 개인 int default_size = 10; 비공개 int 용량; // 배열의 길이를 저장 개인 개체 [] elementData; // 루프 큐의 요소를 저장하기 위해 배열을 정의합니다. private int front = 0; // fleet head private int rear = 0; // 터미널 팀 // 기본 배열 길이 public loopqueue를 사용하여 빈 루프 큐 생성; elementData = 새로운 객체 [용량]; } // 초기화 요소가있는 루프 큐 생성 공개 루프 큐 (t element) {this (); ElementData [0] = 요소; 리어 ++; } / *** 지정된 길이 배열로 루프 큐 생성* @param 요소 루프 큐에서 첫 번째 요소를 지정* @param initsize 루프 큐의 기본 배열의 길이* / public loopqueue (t element, int initsize) {this.capacity = initsize; elementData = 새로운 객체 [용량]; ElementData [0] = 요소; 리어 ++; } // 루프 큐의 크기를 가져옵니다. public int size () {if (isempty ()) {return 0; } 리턴 후면> 전면? 후면 - 전면 : 용량 - (전면 - 후면); } // 대기열 삽입 공용 void add (t element) {if (rear == front && elementData [front]! = null) {새로운 indexOutOfBoundSexception ( "대기열이 가득 찬 예외"); } elementData [rear ++] = 요소; // 후면이 끝에 도달하면 머리를 뒤로 돌립니다 = 뒷면 == 용량? 0 : 후면; } // 큐를 제거 public t remove () {if (isempty ()) {throw new indexoutofboundsexception ( "빈 큐 예외"); } // 대기열의 후단에 요소의 값을 유지합니다. t OldValue = (t) ElementData [Front]; // 큐 요소의 후단에 요소를 해제하십시오. // 전면이 끝에 도달하면 Front = Front == 용량을 돌립니다. 0 : 전면; OldValue를 반환하십시오. } // 큐의 상단 요소를 반환하지만 대기열의 상단 요소를 삭제하지 마십시오. public t element () {if (isempty ()) {새 indexOutOfBoundSexception ( "빈 큐 예외"); } return (t) ElementData [Front]; } // 루프 대기열이 빈 큐 공개 대기열인지 확인 public boolean isempty () {// 뒷면 == 전면 및 후면의 요소는 null 리턴 뒷면 == front && elementData [rebect] == null; } // 루프 대기열을 지우십시오 public void clear () {// 기본 배열의 모든 요소를 null arrays.fill (elementData, null)에 할당합니다. 전면 = 0; 후면 = 0; } public String toString () {if (isempty ()) {return "[]"; } else {// 전면 <후면이면 유효한 요소는 전면과 후면 사이의 요소입니다. if (front <rear) {StringBuilder sb = new StringBuilder ( "["); for (int i = front; i <rear; i ++) {sb.append (elementData [i] .toString ()+","); } int len = sb.length (); sb.delete (len -2, len) .append ( "]"). tostring (); } // Front> = 후면이면 유효한 요소는 전면-> 용량과 0-> Front {StringBuilder sb = new StringBuilder ( "["); for (int i = front; i <용량; i ++) {sb.append (ElementData [i] .toString ()+","); } for (int i = 0; i <rear; i ++) {sb.append (elementData [i] .toString ()+","); } int len = sb.length (); sb.delete (len -2, len) .append ( "]"). tostring (); }}} public static void main (String [] args) {loopqueue <string> queue = new loopqueue <string> ( "aaaa", 3); // 두 개의 요소 추가 queue.add ( "bbbb"); queue.add ( "CCCC"); // 현재 큐는 전체 system.out.println (queue)입니다. // 요소를 삭제 한 후 큐는 다른 요소 queue.remove ()를 추가 할 수 있습니다. System.out.println ( "요소를 삭제 한 후 큐 :" + 큐); // 요소를 다시 추가하면 큐가 다시 queue.add ( "dddd"); System.out.println (대기열); System.out.println (대기열); System.out.println (대기열); // 요소를 삭제 한 후 큐는 다른 요소 queue.remove ()를 추가 할 수 있습니다. // 요소를 다시 추가하면 대기열이 다시 가득 찼습니다. queue.add ( "eeee"); System.out.println (대기열); }}위의 Java 대기열 구현 방법 (순차 대기열, 체인 큐, 루프 큐)은 내가 공유 한 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.