前言:
队列应该是最好理解的一个数据结构了。队列就像我们去买东西之类的排队,总的来说就先进先出,先到先得的意思。队列好理解,但是真正用在开发还是很难的。比如抢购的流量很大,有些会用队列来排序抢得。
图解:
假设有 1 2 3 4个人。一起进入一条通道,通道不允许并行通过。
接下来,1就先出去,2 3 4 接着出,就是这样了。不难。。
代码编写:
package com.ern.demo;
public class MyQueue {
int[] queueArray; // 定义一个队列数组
private int maxSize; // 数组的最大长度
private int front; // 第一个
private int rear; // 最后一个
private int nItemer; // 总共多少个数据
public MyQueue(int maxSize) {
this.maxSize = maxSize;
queueArray = new int[maxSize];
front = 0;
rear = -1;
nItemer = 0;
}
/**
* 判断里面是否有数据
*
* @return
*/
public boolean isEmpty() {
return nItemer == 0;
}
/*
* 队列是否满了
*/
public boolean isFull() {
return maxSize == nItemer;
}
/**
* 方式一:最先进入的出队列后,后面的前移
*
* @return
*/
public int remove() {
if (isEmpty()) {
System.out.println("队列是空的,无法删除");
return -1;
}
//拿到第一个,用于返回告诉删除的是啥
int temp = queueArray[front];
//将要删除的第二位开始每一位前移
for (int i = 0; i < queueArray.length - 1; i++) {
queueArray[i] = queueArray[i + 1];
}
nItemer--;
return temp;
}
/**
* 方式二:队列先满了。然后将队列中所有值出队列
* 后重新开放队列
* @return
*/
public int remove2() {
if (isEmpty()) {
System.out.println("队列是空的,无法删除");
return -1;
}
//每次调用都要都加一,即下次弹出的是下一个,知道满
int temp = queueArray[front++];
if (front == maxSize) {
front = 0;
}
//总的值
nItemer--;
return temp;
}
/**
* 插入数据
*
* @param value
*/
public void insert(int value) {
//判断是否满了
if (isFull()) {
System.out.println("队列满了");
return;
}
// 如果当前读取的索引在最大的位置上,则索引归位了-1
if (rear == maxSize - 1) {
rear = -1;
}
/*
* 插入后,游标指向增加。即
* 假设rear=1 将传入的值赋值给 arg[2]后
* 前++是在赋值前就先+1
*/
queueArray[++rear] = value;
nItemer++;
}
public static void main(String[] args) {
MyQueue myQueue = new MyQueue(10);
for (int i = 0; i < 12; i++) {
if (!myQueue.isFull()) {
myQueue.insert(i);
}
}
for (int i = 0; i < myQueue.queueArray.length; i++) {
System.out.print(myQueue.remove() + " ");
}
}
}
总结:
队列差不多就是这样了,额,总结不知道总结什么。因为队列和栈一样原理都很相像。只是出的顺序不同而已。接下来小编将进入链表。和大家一起学习。
程序人生,与君共勉!