链表实现,插入节点放最后就行了。
代码:
- package nuaa.ds;
- import java.util.NoSuchElementException;
- public class LinkedQueue<T> {
- private Node<T> head;
- private Node<T> tail;
- private int size;
- public void enqueue(T t){
- if(null==t){
- throw new IllegalArgumentException();
- }
- if(size==0){
- head = new Node<T>(t);
- tail = head;
- size++;
- return;
- }
- Node<T> p = new Node<T>(t);
- tail.next = p;
- tail = p;
- size++;
- }
- public T dequeue(){
- if(size==0){
- throw new NoSuchElementException();
- }
- Node<T> p = head;
- head = head.next;
- return p.u;
- }
- public LinkedQueue(){
- this.size = 0;
- }
- public boolean isEmpty(){
- return size==0 ? true : false;
- }
- public T element(){
- return head.u;
- }
- public int size(){
- return size;
- }
- class Node<U>{
- U u;
- Node<U> next;
- public Node(U u) {
- super();
- this.u = u;
- }
- }
- }
数组实现循环队列:
分离出满和空单独讨论,满就doble size,空了就把索引head tail都置为-1
代码:
- package nuaa.ds;
- import java.util.NoSuchElementException;
- public class Queue<E> {
- private Object[] arrays = new Object[this.capacity]; //holds the objects
- private int size=0; //current size
- private int capacity = 2; //default capacity
- private int head = -1; //location of the head of queue
- private int tail = -1; //location of the tail of queue
- public void enqueue(E e) {
- if(null==e){
- throw new IllegalArgumentException("e is null");
- }
- if(this.size()>=this.capacity||arrays.length==0){// arrays is full
- Object[] old = this.arrays;
- this.capacity = 2*this.capacity;
- this.arrays = new Object[this.capacity];
- this.head = 0;
- this.tail = old.length-1;
- for(int i=0;i<old.length;i++){//copy the elements
- arrays[i] = old[i];
- }
- //add the element
- this.tail++;
- }else{// not full
- if(head==-1&&tail==-1){//empty
- this.head = 0;
- this.tail = 0;
- }else if(head<tail){
- if(tail==capacity-1){//tail is at the end of the arrays
- this.tail = 0;
- }else{
- tail++;
- }
- }else{//head>tail
- tail++;
- }
- }
- this.size++;
- arrays[tail] = e;
- }
- public E dequeue() {
- if(size==0){//empty
- throw new NoSuchElementException();
- }
- if(size==1){//only 1 element
- this.head = -1;
- this.tail = -1;
- this.size--;
- return (E)this.arrays[tail];
- }
- if(head==capacity-1){
- this.head = 0;
- this.size--;
- return (E)arrays[capacity-1];
- }
- this.size--;
- this.head++;
- return (E)arrays[head-1];
- }
- public boolean isEmpty(){
- return size==0 ? true : false;
- }
- public int size() {
- return this.size;
- }
- }