> 文章列表 > 队列的模拟实现

队列的模拟实现

队列的模拟实现

 

目录

 

1:普通队列的代码实现

1. 概念

2 .队列的使用

3 .队列模拟实现

2.循环队列

1.环形队列通常使用数组实现。

 2.模拟实现

3.双端队列


1:普通队列的代码实现

1. 概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear出队列:进行删除操作的一端称为队头 Head/Front

2 .队列的使用

3 .队列模拟实现

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

public interface MyQueue <E>{//入队列void offer(E val);//出队列E poll();//查看队列头元素E peek();}
import java.util.NoSuchElementException;public class LinkedQueue <E> implements MyQueue<E>{private Node head;private Node tail;private int size;class Node{//E val;Node next;public Node(E val) {this.val = val;}}@Overridepublic String toString() {return super.toString();}@Overridepublic void offer(E val) {Node node = new Node(val);if(head == null){head = tail = node;}else {tail.next = node;tail = tail.next;}size++;}@Overridepublic E poll() {if(size == 0){throw new NoSuchElementException("没有元素哦~");}E val = head.val;head = head.next;size--;return val;}@Overridepublic E peek() {if(size == 0){throw new NoSuchElementException("没有元素哦~");}return head.val;}
}

2.循环队列

1.环形队列通常使用数组实现。

 2.模拟实现

import practice_3_22.MyQueue;import java.util.NoSuchElementException;public class LoopQueue <E> implements MyQueue<E> {//存放元素的数组private Object [] data;//指向队列的头部,是最先出队列的元素private int head;//指向队尾元素的下一个位置private int tail;//
//    private int size;public LoopQueue(int capacity) {this.data = new Object[capacity+1];}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("[");//int index = tail == 0?data.length-1:tail-1;for (int i = head; i != tail;) {sb.append(data[i]);if(i!= index){sb.append(",");}i = (i+1) % data.length;}sb.append("]");return sb.toString();}@Overridepublic void offer(E val) {if(ifFull()){throw new IllegalStateException("元素满了哦~");}data[tail] = val;tail = (tail + 1) % data.length;
//        size++;}@Overridepublic E poll() {if(isEmpty()){throw new NoSuchElementException("没有元素哦~");}E val = (E) data[head];head = (head+1) % data.length;
//        size--;return val;}public int size(){return (tail - head + data.length) % data.length;//        if(isEmpty()){
//            return 0;
//        }else if(tail > head){
//            return tail-head;
//        }else {
//            return tail+data.length - head;
//        }}private boolean isEmpty(){if (head == tail) {return true;}return false;}private boolean ifFull() {return (tail+ 1)% data.length == head;}@Overridepublic E peek() {if(isEmpty()){throw new NoSuchElementException("没有元素哦~");}return (E) data[head];}
}

3.双端队列

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque “double ended queue” 的简称。 那就说明元素可以从队头出队和入队,也可以从队尾出队和入队
Deque是一个接口,使用时必须创建LinkedList的对象。 
Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现