一、什么是队列?
队列是一种特殊的线性表,单向队列只能在一端插入数据(后),另一端删除数据(前);它和栈一样,队列是一种操作受限制的线性表;进行插入操作的称为队尾,进行删除操作的称为队头;队列中的数据被称为元素;没有元素的队列称为空队列。
由于只能一端删除或者插入,所以只有最先进入队列的才能被删除,因此又被称为先进先出(FIFO—first in first out)线性表。
队列分为两种:双向队列和单向队列
单向队列:只能在一端删除数据,另一端插入数据。
双向队列:两端都可以进行插入数据和删除数据操作。
二、java单向队列模拟实现
package com.lzw.demo;
/**
* @author lzw
* @Date 2019年5月15日
*/
public class MyQueue {
private Object[] queArray;
//队列总大小
private int maxSize;
//前端
private int front;
//后端
private int rear;
//队列中元素的实际数目
private int nItems;
public MyQueue(int s){
maxSize = s;
queArray = new Object[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
//队列中新增数据
public void insert(int value){
if(isFull()){
System.out.println("队列已满!!!");
}else{
//如果队列尾部指向顶了,那么循环回来,执行队列的第一个元素
if(rear == maxSize -1){
rear = -1;
}
//队尾指针加1,然后在队尾指针处插入新的数据
queArray[++rear] = value;
nItems++;
}
}
//移除数据
public Object remove(){
Object removeValue = null ;
if(!isEmpty()){
removeValue = queArray[front];
queArray[front] = null;
front++;
if(front == maxSize){
front = 0;
}
nItems--;
return removeValue;
}
return removeValue;
}
//查看对尾数据
public Object peekRear(){
return queArray[rear];
}
//查看对头数据
public Object peekFront(){
return queArray[front];
}
//判断队列是否满了
public boolean isFull(){
return (nItems == maxSize);
}
//判断队列是否为空
public boolean isEmpty(){
return (nItems ==0);
}
//返回队列的大小
public int getSize(){
return nItems;
}
public static void main(String[] args) {
MyQueue queue = new MyQueue(3);
queue.insert(1);
System.out.println("队列大小:"+queue.getSize());
queue.insert(2);
System.out.println("队列大小:"+queue.getSize());
queue.insert(3);//queArray数组数据为[1,2,3]
System.out.println("队列大小:"+queue.getSize());
System.out.println("队头:"+queue.peekFront()); //1
System.out.println("队尾:"+queue.peekRear());
queue.remove();//queArray数组数据为[null,2,3]
System.out.println(queue.peekFront()); //2
System.out.println("队列大小:"+queue.getSize());
queue.insert(4);//queArray数组数据为[4,2,3]
queue.insert(5);//队列已满,queArray数组数据为[4,2,3]
System.out.println("队列大小:"+queue.getSize());
System.out.println("队头:"+queue.peekFront());
System.out.println("队尾:"+queue.peekRear());
}
}
三、双向队列
双向队列就是队列的两端都可以进行删除和插入的操作。
package com.lzw.demo;
import java.util.LinkedList;
/**
* @author lzw
* @param <T>
* @Date 2019年5月15日
*/
public class Deque<T> {
private LinkedList<T> deque = new LinkedList<T>();
/**从队头插入元素*/
public void addFirst(T e) {
deque.addFirst(e);
}
/**从队尾插入元素*/
public void addLast(T e) {
deque.addLast(e);
}
/**获取第一个元素*/
public T getFirst(T e) {
return deque.getFirst();
}
/**获取最后一个元素*/
public T getLast(T e) {
return deque.getLast();
}
/**从队头移出元素*/
public T removeFirst() {
return deque.removeFirst();
}
/**从队尾移出元素*/
public T removeLast() {
return deque.removeLast();
}
/**获取队列的大小*/
public int size() {
return deque.size();
}
public String toString() {
return deque.toString();
}
public static void fillTest(Deque<Integer> de) {
for (int i = 10; i < 17; i++)
de.addFirst(i);
for (int i = 50; i < 55; i++)
de.addLast(i);
}
public static void main(String[] args) {
Deque<Integer> deque = new Deque<Integer>();
fillTest(deque);
System.out.println(deque);
while (deque.size() != 0)
System.out.print(deque.removeFirst() + " ");
System.out.println();
fillTest(deque);
while (deque.size() != 0)
System.out.print(deque.removeLast() + " ");
System.out.println();
}
}