算法与数据结构-队列
Posted Al_tair
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法与数据结构-队列相关的知识,希望对你有一定的参考价值。
队列
大家好呀,我是小笙,这个系列主要记录我学习算法与数据结构的笔记
是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作
主函数实现调用
public static void main(String[] args)
// 按键输入
Scanner sc = new Scanner(System.in);
System.out.print("请输入队列的长度:");
int num = sc.nextInt();
ArrQueue arr = new ArrQueue(num);
while(true)
System.out.println("模拟队列");
System.out.println("1.添加数据,入栈");
System.out.println("2.获取数据,出栈");
System.out.println("3.显示数据");
System.out.println("4.显示头数据,不出栈");
System.out.print("请输入你的选择选择(1~4):");
num = sc.nextInt();
int addNum;
switch (num)
case 1: System.out.print("请输入添加的数字数据:");
addNum = sc.nextInt();
arr.addQueue(addNum);
break;
case 2: System.out.println(arr.getQueueData());
break;
case 3: arr.showArrQueue();
break;
case 4: arr.headQueue();
break;
default:
System.out.println("请你重新输入");
创建类 实现队列创建,出栈,入栈等等
class ArrQueue
/**
* 队列
* 先入先出原则
* 目前问题:
* 1)目前的数组使用一次就不能用了,没有达到复用的效果
* 2)将这个数组使用算法,改进成一个环形的算法 取模%
*/
private int maxsize; // 表示数组的最大容量
private int front; // 队列头
private int rear; // 队列尾
private int[] arr; // 该数据用于存放数据,模拟队列
// 创建队列的构造器
public ArrQueue(int arrMaxSize)
maxsize = arrMaxSize;
arr = new int[maxsize];
front = -1; // 指向队列头部
rear = -1; // 指向队列尾部
// 判断队列是否满
public boolean isFull()
return rear == maxsize - 1;
// 判断队列是否为空
public boolean isEmpty()
return rear == front;
// 添加数据到队列 入队列
public void addQueue(int num)
// 判断队列是否为满
if (isFull())
System.out.println("队列满,不能加入数据!");
return;
rear++;
arr[rear] = num; // 向数组中插入num这个数
// 获取队列的数据 出队列
public int getQueueData()
// 判断是否为空队列
if (isEmpty())
// 通过抛出异常
throw new RuntimeException("队列为空,无法显示数据!");
else
front++;
return arr[front];
// 显示队列的所有数据
public void showArrQueue()
// 判断是否为空队列
if (isEmpty())
System.out.println("队列为空,无法显示数据!");
return;
for (int i = front; i <= rear-1; i++)
System.out.println(arr[i+1] + "\\t");
// 显示头数据不取出
public void headQueue()
// 判断是否为空
if (isEmpty())
System.out.println("队列为空,无法显示数据!");
return;
System.out.println("头数据为" + arr[front + 1]);
/*
* 写到这里,想必大家一定会有疑问,为啥front 和 rear 都是初始值为-1呢?
* 其实初始值为0也是可以的,只不过代码逻辑会发生微小的变化
* 原本当初始值为-1的时候,入队列的步骤:1.rear++ 2.向数组中插入num这个数
* 如果改成初始值为0的时候,入队列的步骤:1.向数组中插入num这个数 2.rear++
* 但是注意:这个初始化为-1仅局限于非循环队列
*/
为实现复用的效果 将原来的队列升级为循环队列
class Circle
private int maxsize; // 表示数组的最大容量
private int front; // 队列头
private int rear; // 队列尾
private int[] arr; // 该数据用于存放数据,模拟队列
// 创建队列的构造器
public Circle(int arrMaxSize)
maxsize = arrMaxSize;
arr = new int[maxsize];
front = 0; // front就指向队列的第一个元素
rear = 0; // rear指向队列最后一个元素的后一个位置
// 判断队列是否满
public boolean isFull()
return (rear+1)%maxsize == front%maxsize;
// 判断队列是否为空
public boolean isEmpty()
return rear == front;
// 添加数据到队列 入栈
public void addQueue(int num)
// 判断队列是否为满
if (isFull())
System.out.println("队列满,不能加入数据!");
return;
arr[rear] = num; // 向数组中插入num这个数
rear = (rear+1)%maxsize;
// 获取队列的数据 出栈
public int getQueueData()
// 判断是否为空队列
if (isEmpty())
// 通过抛出异常
throw new RuntimeException("队列为空,无法显示数据!");
else
int value =arr[front];
front = (front+1)% maxsize;
return value;
// 显示队列的所有数据
public void showArrQueue()
// 判断是否为空队列
if (isEmpty())
System.out.println("队列为空,无法显示数据!");
return;
// 思路:从front开始,遍历多少个元素
for (int i = front; i < front+(rear+maxsize-front)% maxsize; i++)
System.out.println(arr[i%maxsize] + "\\t");
// 显示头数据不取出
public void headQueue()
// 判断是否为空
if (isEmpty())
System.out.println("队列为空,无法显示数据!");
return;
System.out.println("头数据为" + arr[front]);
以上是关于算法与数据结构-队列的主要内容,如果未能解决你的问题,请参考以下文章
Java数据结构及算法实战系列009:Java队列03——数组实现的阻塞队列ArrayBlockingQueue