java_queue
2013-11-23 19:45
323 查看
队列是一种特殊的线性表,先进先出(first in first out)FIFO,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作。
实际应用:排队等待公交车,银行或者超市里的等待列队
出现假溢出的时候的一般解决方法:
一是将队列元素向前平移,对应的队列的顺序存储结构及实现中的a实现
二循环队列,对应的循环队列实现
1.队列的顺序存储结构及实现
a.没有控制队列容量大小的普通队列,数组移位实现(无假溢出现象)
View Code
实际应用:排队等待公交车,银行或者超市里的等待列队
出现假溢出的时候的一般解决方法:
一是将队列元素向前平移,对应的队列的顺序存储结构及实现中的a实现
二循环队列,对应的循环队列实现
1.队列的顺序存储结构及实现
a.没有控制队列容量大小的普通队列,数组移位实现(无假溢出现象)
package collectionsFramework.queue; /** * @Package collectionsFramework.queue * * @ClassName: LoopQueue * * @Description: TODO(这里用一句话描述这个类的作用) * * @author andy * * @date 2013-11-24 下午11:32:52 */ public class LoopQueue<T> { private int DEFAULT_SIZE = 10; // 保存数组的长度。 private int capacity; // 定义一个数组用于保存循环队列的元素 private Object[] elementData; private int front = -1; private int rear = -1; // 以默认数组长度创建空循环队列 public LoopQueue() { capacity = DEFAULT_SIZE; elementData = new Object[capacity]; } // 判断是否为空 private boolean empty() { return front == -1; } // 判断栈是否满了 public boolean isFull() { return (rear + 1) % capacity == front; } // 置空 public void clear() { front = rear = -1; } //元素个数 /*public int length() { if (empty()) { return 0; } return (rear - front + capacity) % capacity; }*/ public int length() {// 队列长度 if(empty()){ return 0; } if (rear >= front) return rear - front + 1; else return capacity - (front - rear) + 1; } // 插入队列 public T add(T element) { if (isFull()) { System.out.println("队列已经满了"); return null; } if (empty()) { front = rear = 0; } else { rear = (rear + 1) % capacity; } elementData[rear] = element; return element; } // 移除队列顶部元素 public T remove() { if (empty()) { System.out.println("空队列"); throw new IndexOutOfBoundsException("空队列异常"); } T oldData = (T) elementData[front]; elementData[front] = null; if (front == rear) { clear(); return oldData; } front = (front + 1) % capacity; return oldData; } // 返回队列顶部元素,但不删除元素 public T element() { if (empty()) { return null; } return (T) elementData[front + 1]; } public String toString() {// 打印所有元素 if (empty()) { return "[]"; }else{ StringBuilder sb = new StringBuilder("["); int i = front; int j = 0; while(j < length()){ sb.append(elementData[i].toString() + ", "); i = (i + 1) % capacity; j++; } /*for (int j = 0; j < length(); i = (i + 1) % capacity, j++){ sb.append(elementData[i].toString() + ", "); }*/ int len = sb.length(); return sb.delete(len - 2, len).append("]").toString(); } } public static void main(String[] args) { LoopQueue<String> queue = new LoopQueue<String>(); for (int i = 0; i < 100; i++) { System.out.println("元素:" + queue.add("a" + i) + " 入列"); System.out.println("字符串表示:" + queue); if(queue.length() == queue.capacity){ System.out.println("元素:"+queue.remove() + " +++++++++++++出列"); } //System.out.println("元素长度:" + queue.length()); } //queue.clear(); while(queue.length() != 0){ System.out.println("字符串表示:" + queue); System.out.println("元素:"+queue.remove() + " 出列"); } } }
View Code
相关文章推荐
- Java集合源码学习(15)_Queue接口的实现PriorityQueue和PriorityBlockingQueue
- Java: Queue
- Java中WeakReference、WeakHashMap、SoftReference、ReferenceQueue的作用和使用场景 .
- java.util.concurrent.LinkedBlockingQueue
- Java集合的Stack、Queue、Map的遍历
- Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)
- Java基础-Queue队列
- java中List、Map、Set、Collection、Stack、Queue等的使用
- java中使用队列:java.util.Queue
- java队列Queue、双端队列Deque
- 【Java】2.ArrayBlockingQueue使用与分析
- java LinkedBlockingQueue和ConcurrentLinkedQueue的区别
- Java常见集合框架(十四):Queue之Queue、BlockingQueue、AbstractQueue
- Java集合(13)——Queue与Deque源码解析
- 优先级队列(java.util.PriorityQueue<E>)
- java中queue的使用
- 【Java】LinkedBlockingQueue、PriorityQueue and ConcurrentLinkedQueue
- [Java数据结构]线性表之队列Queue
- java(35):数据结构(4)--Queue(2)接口设计练习