数据结构之队列

【数据结构】队列(顺序队列、循环队列、链队列) 文章目录 前言 一、队列的定义 二、队列的顺序存储结构 1.顺序队列的定义 2.循环队列定义 3.循环队列的基本操作 三、队列的链式存储结构 1.链队列的定义 2.链队列的基本操作 前言 队列也是一种线性表,其特殊性在于队列的基本操作是线性表的子集。队列按“先进先出”的规则进行操作,故称其为操作受限的线性表。 一、队列的定义 队列(queue)是只允许在一端进行插入操作,在另一端进行删除操作的线性表,简称“队”。 队列是一种先进先出(First In First Out)的 阅读详情

队列

一、使用场景:银行排队系统

二、概念

a.队列是一个有序列表,可以用数组或者链表来实现。
b.遵循先入先出的原则
c.数组队列示意图,maxSize最大容量、Queuce类、front队列前端,rear队列后端,front随数据输出而变化,rear随数据输入而变化
在这里插入图片描述

d.当我们将数据存入队列时,称为,“addQueue”它需要处理两个步骤
①将尾指针往后移,rear+1 ,当front==rear时队列为空
②若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据,rear==maxSize-1时队列满,无法存入数据。

三、代码实现

import java.util.Scanner;
public class QueueDemo {
	public static void main(String[] args) {
 		//测试
		ArrayQueue arrayQueue = new ArrayQueue(3);
		char key=' ';
		Scanner scanner= new Scanner(System.in);
		boolean loop=true;
		while (loop){
			System.out.println("s(show):显示队列");
			System.out.println("e(exit):退出列表");
			System.out.println("a(add):添加队列");
			System.out.println("g(get):获取队列指");
			System.out.println("h(head):显示队列头");
			key=scanner.next().charAt(0);//接受一个字符
			switch (key){
				case 's':
					arrayQueue.showQueue();
					break;
				case 'a':
					System.out.println("请输入一个值");
					int i = scanner.nextInt();
					arrayQueue.addQueue(i);
					break;
				case 'g':
					try {
						int res = arrayQueue.getQueue();
						System.out.printf("取出的数据%d\n",res);
					}catch (Exception e){
						System.out.println(e.getMessage());
					}
					break;
				case 'h':
					try {
						int headQueue = arrayQueue.headQueue();
						System.out.printf("队列头数据%d\n",headQueue);
						break;
					}catch (Exception e){
						System.out.println(e.getMessage());
					}
					break;
				case 'e'://退出
					scanner.close();
					loop=false;
					break;
				default:
					break;
			}
		}
		System.out.printf("程序退出啦啦啦");

	}


}
	//数组模拟队列
class ArrayQueue {
	private int maxSize;//数组最大容量
	private int front ;//队列头,分析出front是指向队列头的前一个位置
	private int rear;//队列尾,指向队列尾的数据,即队列最后一个数据
	private int[] arr; //该数组用于存放数据,模拟队列

	//创建队列构造器
	public ArrayQueue(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 n){
		if (isFull()){
			System.out.println("队列已满,不能加数据");
			return;
		}
		rear++;
		arr[rear]=n;
	}
	//数据出队列
	public int getQueue(){
		if (isEmpty()) {
			//通过抛出异常来处理
			throw new RuntimeException("队列为空不能取数据");
		}
		front++;//front后移
		return arr[front];
	}
	//显示队列的所有数据
		public void showQueue(){
		if (isEmpty()){
			System.out.println("队列为空");
			return;
		}
			for (int i = 0; i < arr.length; i++) {
				System.out.printf("arr[%d]=%d\n",i,arr[i]);
			}
		}
		//显示队列的头数据,注意不是取出数据
		public int headQueue(){
			if (isEmpty()) {
				//通过抛出异常来处理
				throw new RuntimeException("队列为空不能取数据");
			}
			return arr[front+1];
		}

}

四、上述代码的缺陷及改造成环形队列

①、目前数组使用一次就不能用,没有达到复用的效果

②、将这个数组使用算法,改进一个环形的队列
1)、front变量含义做一个调整:指向队列第一个元素,arr[front]就是队列的第一个元素,front初始值为0
2)、rear变量含义做一个调整:指向队列的最后一个元素的后一个位置,因为我们希望空出一个空间作为约定,rear的初始值为0。
3)、当队列满时,条件是,(rear+1)%maxSize=front【满】
4)、当队列为空时,条件是rear=front
5)、队列中有效的数据个数(rear+maxSize-front)%maxSize
6)、我们就可以在原来的队列上修改得到一个环形队列

③、环形队列代码实现

import java.util.Scanner;
public class CircleArrayQueueDemo {
	public static void main(String[] args) {
		//测试
		CircleArray arrayQueue = new CircleArray(4);//设置为4,有效数据最大是3,约定值在不断的变化
		char key=' ';
		Scanner scanner= new Scanner(System.in);
		boolean loop=true;
		while (loop){
			System.out.println("s(show):显示队列");
			System.out.println("e(exit):退出列表");
			System.out.println("a(add):添加队列");
			System.out.println("g(get):获取队列指");
			System.out.println("h(head):显示队列头");
			key=scanner.next().charAt(0);//接受一个字符
			switch (key){
				case 's':
					arrayQueue.showQueue();
					break;
				case 'a':
					System.out.println("请输入一个值");
					int i = scanner.nextInt();
					arrayQueue.addQueue(i);
					break;
				case 'g':
					try {
						int res = arrayQueue.getQueue();
						System.out.printf("取出的数据%d\n",res);
					}catch (Exception e){
						System.out.println(e.getMessage());
					}
					break;
				case 'h':
					try {
						int headQueue = arrayQueue.headQueue();
						System.out.printf("队列头数据%d\n",headQueue);
						break;
					}catch (Exception e){
						System.out.println(e.getMessage());
					}
					break;
				case 'e'://退出
					scanner.close();
					loop=false;
					break;
				default:
					break;
			}
		}
		System.out.printf("程序退出啦啦啦");
	}
}
class CircleArray{
	private int maxSize;//数组最大容量
	private int front ;//队列头,指向队列第一个元素,arr[front]就是队列的第一个元素,front初始值为0
	private int rear;//队列尾,指向队列的最后一个元素的后一个位置,因为我们希望空出一个空间作为约定,rear的初始值为0。
	private int[] arr; //该数组用于存放数据,模拟队列

	public CircleArray(int arrMaxSize){
		maxSize=arrMaxSize;
		arr=new int[maxSize];
	}
	//判断队列是否满
	public boolean isFull(){
		return (rear+1)%maxSize==front;
	}
	//判断队列是否为空
	public boolean isEmpty(){
		return rear==front;
	}
	//添加数据到队列
	public void addQueue(int n){
		if (isFull()){
			System.out.println("队列已满,不能加数据");
			return;
		}
		//直接将数据加入
		arr[rear]=n;
		//将rear后移,必须考虑取模
		rear=(rear+1)%maxSize;
	}
	//取出数据
	public int getQueue(){
		if (isEmpty()) {
			//通过抛出异常来处理
			throw new RuntimeException("队列为空不能取数据");
		}
		//这里需要分析出front是指向队列的第一个元素,首相,把front对应的值保存到一个临时的变量,将front后移,考虑取模,将临时保存的变量返回
		int value= arr[front];
		front=(front+1)%maxSize;
		return value;
	}
	//显示队列的所有数据
	public void showQueue(){
		if (isEmpty()){
			System.out.println("队列为空");
			return;
		}
		//思路,从front开始遍历,遍历多少个元素
		//
		for (int i = front; i < front+size(); i++) {
			System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
		}
	}
	//求出当前队列有效数据的个数
	public int size(){
		return (rear+maxSize-front)%maxSize;
	}
	//显示队列的头数据,注意不是取出数据
	public int headQueue(){
		if (isEmpty()) {
			//通过抛出异常来处理
			throw new RuntimeException("队列为空不能取数据");
		}
		return arr[front];
	}

}

【数据结构】——队列 队列(Queue)的抽象数据结构类型 //基本操作: InitQueue (&Q) //构造一个空队列Q。 //以下前提条件为队列已经存在 Des t royQueue (&Q) //队列Q被销毁, 不再存在。 ClearQueue (&Q) //将Q清为空队列。 QueueEmpty (Q) //若Q为空队列,则返回true, 否则返回false。 QueueLength(Q) //返回Q的元素个数,即队列的长度。 EnQueue (&Q, e} // 阅读详情

相关推荐

数据结构学习:队列

数据结构与算法学习:队列

kkbbaaii的博客 1109

数据结构——队列

在计算机科学中,数据结构(data structure)是一种数据组织、管理和存储的格式。它是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术相关。数据结构研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系。它包含三个方面的内容:即数据的逻辑结构、数据的存储结构和数据的操作,只有这三个方面的内容完全相同,才能成为完全相同的数据结构。

2302_80243065的博客 1374

Amesim基础篇-元件详解-流体库管路

Amesim基础篇-元件详解-流体库管路

2201_75375391的博客 4524

数据结构——队列的详解

队列和栈相反,队列(queue)是一种先进先出(FIFO:first in first out)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。队列和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫队尾(tear),允许删除的一端称为队头(front)

晴空๓ 5635

深圳SILAS(智能融合低空系统)无人机调度系统介绍

一、系统定位与核心目标SILAS(Smart Integrated Lower Airspace System)是深圳市为低空经济打造的“数字大脑”,由粤港澳大湾区数字经济研究院自主研发,定位为城市级低空飞行智能调度与管理平台。核心目标是解决低空经济中“高密度、高复杂度、多主体”的飞行调度难题,实现空域资源的高效分配、飞行安全的智能监管及全场景服务的无缝协同,支撑深圳从“无人机之都”向“天空之城”升级。二、核心架构:低空基础设施“四张网”设施网。

主攻大数据 人工智能 物联网 安全 低空经济等方向。mtsc 、gtest特邀分享嘉宾 3747

OpenHarmony 5.1 RK3568 开发板烧录:从源码编译到镜像写入的 6 步实战

本文详细解析了OpenHarmony 5.1在RK3568开发板上的全链路开发流程,包括环境搭建、源码编译、镜像烧录等6个关键步骤。通过实战指南和避坑技巧,帮助开发者快速掌握OpenHarmony系统的烧录与定制能力,提升物联网设备开发效率。

weixin_33722405的博客 343

【数据结构之队列系列】队列详解

前面我们学习了一种数据结构:栈,栈是一种只允许在一端尽进行插入删除的数据结构,而今天我们将学习另一种数据结构:队列,队列是一种支持在一端进行插入,在另一端进行删除的数据结构。

胡坚涛的博客 4266

AI基础入门(大模型基础篇)——技术视角:你应该知道的LLM基础知识

本文从技术视角解析了大模型的工作原理,主要介绍了三个核心概念:Token、温度和Embedding。首先,大模型通过逐个添加Token来生成文本,Token数量直接影响上下文窗口大小和计费标准。其次,通过引入温度参数控制随机性,温度越高输出越多样化。最后,解释了字符串如何通过One-Hot编码和神经网络压缩转化为向量形式的Embedding,这是AI处理各类输入的基础。这些概念对理解大模型应用开发至关重要,Token决定处理能力,温度影响输出风格,Embedding则是信息转换的关键步骤。

小志的博客 1506

【队列】数据结构队列的实现

队列的实现

m0_56069910的博客 1139

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7842

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

【数据结构】—— 队列

队列的链式存储结构,队列的顺序存储结构(循环队列)

ElvInR的博客 3010

手把手教你玩转Infoseek舆情监测系统:从数据爬取到智能分析实战

别只会监测品牌名!一个有效的监测体系应该包括:// 完整的监测关键词策略brand: ["品牌名", "产品名", "缩写"],executives: ["CEO姓名", "高管姓名"],campaign: ["当前营销活动名称"],competitors: ["竞品A", "竞品B"],industry: ["行业通用关键词"],// 别忘了常见拼写错误和黑称defensive: ["常见的错误拼写", "用户起的黑称"]产品优化:从用户吐槽中发现改进点市场洞察。

2501_93332955的博客 758

数据结构之队列详解

数据结构之队列详解 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录数据结构之队列详解前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内

艾小方的博客 2032

点云去噪:基于点云拟合的方法

点云处理是计算机视觉中的重要任务之一,而点云去噪是点云处理的关键步骤之一。在实际应用中,由于采集设备的噪声、运动估计误差或者环境干扰等因素,点云数据中常常包含有噪声点,这些噪声点会对后续的点云分析和处理造成不良影响。一种简单的方法是计算点到拟合曲面的距离,并将距离超过某个阈值的点定义为噪声点,进行过滤。一种简单的方法是计算点到拟合曲面的距离,并将距离超过某个阈值的点定义为噪声点,进行过滤。该方法通过拟合点云数据的曲面模型,对噪声点进行识别和过滤,从而得到更加干净的点云数据。

AuSwift的博客 639

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【数据结构】队列

队列(Queue) 是一种遵循先进先出(First In, First Out, FIFO)原则的线性数据结构,元素的插入和删除操作分别在队列的两端进行。

2301_80541270的博客 1594

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【数据结构】栈和队列

本文系统介绍了栈和队列两种基础数据结构。栈遵循"先进后出"原则,仅允许在固定端进行插入和删除操作;队列遵循"先进先出"原则,在一端插入,另一端删除。文章详细分析了双端队列和循环队列的实现原理,包括角标移动公式、有效长度计算等核心算法。同时比较了链表和数组两种实现方式的复杂度差异,并展示了Java集合框架中Stack类和Queue接口的具体使用方法。通过限制操作方式,任何线性结构都能实现栈或队列的特性,为程序设计提供了灵活的数据组织工具。

2503_92883549的博客 1181

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【数据结构】队列的实现

队列的实现

日出等日落 2082

数据结构中的队列_数据结构中的队列类型

数据结构中的队列Queue is an important structure for storing and retrieving data and hence is used extensively among all the data structures. Queue, just like any queue (queues for bus or tickets etc.) follows...

culing2941的博客 1323
上一篇: 数据结构之稀疏数组,保存到磁盘,从磁盘中读取
下一篇: 数据结构之链表
噢!不杰克
博客等级 码龄7年 4443粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值