队列

数组实现队列类

  • 队列中所需要的变量和方法如下
    • 成员变量
      * 数组 
      * 数组最大长度
      * front:与队首有关的
      * rear:与队尾有关的	
    
    • 成员方法
      * 构造方法:完成对成员变量的初始化
      * 判断队列是否为空
      * 判断队列是否以满
      * 入队
      * 出队
      * 查看队首元素
      * 遍历队列
      * 计算队列最多的元素个数
    

非循环队列:好理解

  • 构造函数
    • front:表示队首的前一个位置的下标
    • rear:表示最后一个元素的下标
class Queue {
	private int maxSize;
	private int front;
	private int rear;
	private int[] arr;
	public Queue(int max) {
		maxSize=max;
		front=-1;
		rear=-1;
		arr=new int[maxSize];
	}
  • 判断队列是否已满
    如果队列已满,那么rear应该是数组最后一个元素
public boolean isFull() {
		if(rear==maxSize-1)
			return true;
		else
			return false;
	}
  • 判断队列是否为空
    如果队列为空,那么队首元素front等于队尾元素rear
public boolean isEmpty() {
		if(rear==front)
			return true;
		else
			return false;
	}
  • 入队
    如果队列未满,那么可以入队。入队时,只能往后排,即将队尾元素加1,并赋值
public void addQueue(int value){
		if(isFull())
			throw new RuntimeException("队满,不能入队");
		else {
			rear++;
			arr[rear]=value;
		}
			
		
	}

  • 出队
    如果队列不为空,可以出队。出队时,只能出队首元素(先来后到)。所以front++,返回此元素
public int getQueue() {
		if(isEmpty())
			throw new RuntimeException("队空,不能出队");
		front++;
		return arr[front];
	}
  • 查看队首元素
    查看队首元素时,队列的元素不发生改变(注意与出队操作区别)。front的值不变
public int headQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队空,无队首");
		}
		
		return arr[front+1];
	}
  • 遍历队列
	public void showQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队空,无法显示");
		}
		for(int i=0;i<maxSize;i++)
			System.out.println("arr["+i+"]="+arr[i]);
	}

循环队列:重要,有点难理解

  • 为什么有循环队列
    当我们使用非循环队列时,如果我们执行了出队操作,那么便会在数组的队首位置空出一个空间。但是,使用第一个队列的结构,此空间无法再次使用。所以,我们构造循环队列。循环队列在物理结构上仍然是一个直线结构,但是我们通过对队首元素和队尾元素的1特殊处理,使其形成一个逻辑意义上的循环
  • 这个链接是一个模拟循环队列的。 循环队列模拟
  • 说明:循环队列有多种实现方式,我所描述的只是其中一种
  • 理解
    • front表示队首元素,rear表示队尾元素的下一个位置。
      假设数组的容量是3,那么当最后一个元素的下标是1时,rear的位置是2;当最后一个元素的位置是2时,rear的位置是0。
    • 数组中要空出一个位置。
      也就是说如果数组的最大容量是max,那么队列中最多有max-1个元素.
    • 为什么空出一个位置呢?
      如果不空出一个位置,front==rear既可以表示队列满,也可以表示队列空。如果空出一个位置,rear==front只能表示队列空的时候。队列满的时候如果rear>front,那么rear=maxSize-1,front=0;如果rear<front,那么rear+1==front,以上两种情况均可以使用(rear+1)%maxSize==front表示.
    • 队列中的元素的个数
      (rear-front+maxSize)%msxSize
    • 每次添加元素,队尾元素rear的下标变成(rear+1)%maxSize
    • 每次出队,front的下标变成(front+1)%maxSize
  • 构造函数
    front 初始化为0,rear初始化为0
public CircleQueue(int max) {
		this.maxSize=max;
		front=0;
		rear=0;
		arr=new int[max];//不要忘记
	}
  • 判空
public boolean isEmpty() {
		if(front==rear)
			return true;
		else
			return false;
	}
  • 判满
public boolean isFull() {
		if((rear+1)%maxSize==front)//注意
			return true;
		else
			return false;
	}
  • 入队
public void addQueue(int value) {
		if(isFull()) {
			throw new RuntimeException("队满");
			return;
		}		
			arr[rear]=value;
			rear=(rear+1)%maxSize;//注意
		
	}
  • 出队
public int getQueue() {
		if(isEmpty())
		{
			throw new RuntimeException("队空,不能出队");
		}
		
		int value=arr[front];
		front=(front+1)%maxSize;//注意
		return value;
	}
  • 查看队首元素
public int headQueue() {
		if(isEmpty()) {
			throw new RuntimeException("队空,无队首");
		}
		return arr[front];
	}
  • 遍历队列
	//查看元素个数
		public int getNum() {
			return (rear-front+maxSize)%maxSize;//注意
		}
	//查看全部队列元素
	public void showQueue() {
		for(int i=front;i<front+getNum();i++)//控制循环的次数
			System.out.println("arr["+(i%maxSize)+"]="+arr[i%maxSize]);//注意
	}
智慧消防安全与应急管理是现代城市安全管理的重要组成部分,随着城市化进程的加速,传统消防安全管理面临着诸多挑战,如消防安全责任制度落实不到位、消防设施日常管理不足、消防警力不足等。这些问题不仅制约了消防安全管理水平的提升,也给城市的安全运行带来了潜在风险。然而,物联网和智慧城市技术的快速发展为解决这些问题提供了新的思路和方法。智慧消防作为物联网和智慧城市技术结合的创新产物,正在成为社会消防安全管理的新趋势。 智慧消防的核心在于通过技术创新实现消防安全管理的智能化和自动化。其主要应用包括物联网消防安全监管平台、城市消防远程监控系统、智慧消防平台等,这些系统利用先进的技术手段,如GPS、GSM、GIS等,实现了对消防设施的实时监控、智能巡检和精准定位。例如,单兵定位方案通过信标点定位和微惯导加蓝牙辅助定位技术,能够精确掌握消防人员的位置信息,从而提高救援效率和安全性。智慧消防不仅提升了消防设施的管理质量,还优化了社会消防安全管理资源的配置,降低了管理成本。此外,智慧消防的应用还弥补了传统消防安全管理中数据处理方式落后、值班制度执行不彻底等问题,赋予了建筑消防设施智能化、自动化的能力。 尽管智慧消防技术在社会消防安全管理工作中的应用已经展现出巨大的潜力和优势,但目前仍处于实践探索阶段。相关职能部门和研究企业需要加大研究开发力度,进一步完善系统的功能与实效性。智慧消防的发展既面临风险,也充满机遇。当前,社会消防安全管理工作中仍存在制度执行不彻底、消防设施日常维护不到位等问题,而智慧消防理念与技术的应用可以有效弥补这些弊端,提高消防安全管理的自动化与智能化水平。随着智慧城市理念的不断发展和实践,智慧消防将成为推动社会消防安全管理工作与城市化进程同步发展的关键力量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值