数据结构与算法——队列
时间:2022-07-25
本文章向大家介绍数据结构与算法——队列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
言
本篇介绍队列的定义、队列的实现方式(数组实现队列,链表实现队列),如果你需要了解其他数据结构,请点击下面链接查看!!!
了解更多:数据结构与算法目录整理
队列
一、队列的定义
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
二、队列的实现方式(顺序存储于链式存储)
1)队列的基本操作及其说明
方法名 |
返回值 |
参数类型 |
说明 |
---|---|---|---|
isFull() |
boolean |
无 |
判断队列是否为满 |
isEmpty() |
boolean |
无 |
判断队列是否为空 |
add(int data) |
void |
int |
向队列中添加元素 |
getOne() |
int |
无 |
从队列中去除元素 |
getHead() |
int |
无 |
获取头部元素 |
getQueue() |
List |
无 |
获取队列元素 |
size() |
int |
无 |
获取队列中元素的个数 |
2)队列的数组实现
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.management.RuntimeErrorException;
/**
* *队列的数组实现
* @author 蜡笔小新
*
*/
public class Test3 {
public static void main(String []args) {
boolean temp=true;
ArrQueue arrQueue=new ArrQueue(3);
while(temp) {
System.out.println("isFull:队列是否为满");
System.out.println("isEmpty:队列是否为空");
System.out.println("add:添加元素");
System.out.println("getOne:获取元素");
System.out.println("getHead:获取头部元素");
System.out.println("getQueue:获取队列");
System.out.println("size:获取队列中元素的个数");
System.out.println("exit:退出程序");
System.out.println("输入你的操作命令:");
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
switch(str) {
case "isFull":
System.out.println(arrQueue.isFull());
break;
case "isEmpty":
System.out.println(arrQueue.isEmpty());
break;
case "add":
System.out.println("输入要添加的数据:");
int n=scanner.nextInt();
arrQueue.add(n);
break;
case "getOne":
try {
int m = arrQueue.getOne();
System.out.println(m);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case "getHead":
try {
int s=arrQueue.getHead();
System.out.println(s);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case "getQueue":
try {
System.out.println(arrQueue.getQueue());
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case "size":
System.out.println(arrQueue.size());
break;
case "exit":
temp=false;
break;
default:
System.out.println("输入有误");
break;
}
}
System.out.println("程序退出!");
}
}
class ArrQueue{
private int maxSize; //队列的最大容量
private int front; //队列头
private int rear; //队列尾
private int []arr; //模拟队列
public ArrQueue(int maxSize) {
this.maxSize=maxSize;
front=-1; //指向头部的前一个位置
rear=-1; //指向尾部的位置
arr=new int[maxSize]; //初始化数组
}
//判断队列是否为空
public boolean isEmpty() {
return front==rear;
}
//判断队列是否为满
public boolean isFull() {
return rear==maxSize-1;
}
//向队列中添加元素
public void add(int data) {
if(isFull()) {
System.out.println("队列已满");
return ;
}
arr[++rear]=data;
}
//从队列中去除元素
public int getOne() throws Exception{
if(isEmpty()) {
throw new Exception("队列为空");
}
return arr[++front];
}
//size() int 无 获取队列中元素的个数
//getHead() int 无 获取头部元素
public int getHead() throws Exception {
if(isEmpty()) {
throw new Exception("队列为空");
}
return arr[front+1];
}
//获取队列元素
public List getQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
List list=new ArrayList<>();
for(int i=front+1;i<=rear;i++) {
list.add(arr[i]);
}
return list;
}
//获取队列元素个数
public int size() {
if(isEmpty()) {
return 0;
}
return rear+1;
}
}
运行结果:
以上就是队列的数组实现,但是我们发现以上方法只能使用一次,无法做到复用的效果,因此对以上代码进行修改如下:
对以上程序中的 getOne()方法进行修改
//从队列中去除元素
public int getOne() throws Exception{
if(isEmpty()) {
throw new Exception("队列为空");
}
int t=arr[++front];
if(isEmpty()) {
front=rear=-1;
}
else {
for(int i=front+1;i<=rear;i++) {
arr[i-1]=arr[i];
}
front--;
rear--;
}
return t;
}
3)队列的链表实现
正在神速整理中。。。。。敬请期待
- 如何使用HAProxy实现Kerberos环境下的Impala负载均衡
- Hue中使用Oozie创建Shell工作流在脚本中切换不同用户
- Python学习(七):模块 优雅的封装
- 非Kerberos环境下Kafka数据到Flume进Hive表
- 6.如何为Hue配置OpenLDAP认证
- Socket 通信原理
- PHP 面试知识梳理
- 5.如何为Impala配置OpenLDAP认证
- 传统Spring项目使用FeignClient组件访问微服务
- 4. 如何为Hive配置OpenLDAP认证
- 3.如何实现OpenLDAP的主主同步
- 2.OpenLDAP集成SSH登录并使用SSSD同步用户
- 1.如何在CentOS6.5安装OpenLDAP并配置客户端
- PHP 面试知识梳理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法