队列——普通队列和环形队列

本文介绍了队列的基本概念,包括其定义、功能及实现逻辑,强调了指针初始值的重要性。接着详细阐述了环形队列,包括其特点、数组满与空的判断条件,以及元素的添加与取出过程。文章最后对比总结了队列与环形队列在指针处理和操作顺序上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列

  • 定义:由一个长度固定的数组和两个指针所组成的数据结构,先进先出。
  • 功能:add delete list
  • 实现逻辑:由组成队列的数组自身是不变化的,指针是一个表示数组下标,而且不断变化的一个数。由于下标的变化,所以可以对于数组不同位置的数进行操作。

建立

class ArrayQueue{
	int[]	queue;//储存元素的数组
	int front;//前指针
	int rear;//后指针
	int max;//表示环形数组的长度
	public ArrayQueue(int max){
		front=-1;
		rear=-1;
		this.max=max;
		queue=new int[this.max];
	}
	
}

我开始时的疑问:为什么要让指针的初始值为-1?
因为数组的下标从0开始,要比数组的下标少一个。

添加队列元素

  1. 队列是否为满,不满才可以添加
public boolen isfull(){
	return (rear-front)==max-1;
	//true为满,false为不满
	}
  1. 添加元素
public void add(int num){
	if(isfull()){
	System.out.println("满了,无法添加");
	return;
	}
	//添加之后,后面的指针后移
	queue[++rear]=num;
}

取出元素

  1. 检查队列是否为空
public boolen isenpty(){
	return front==rear;
	//true是空的,false是满的
	}
  1. 取出元素
public void get(){
	if(isempty()){
		System.out.println("队列为空!");
		}
	return queue[++front];
	}
		

环形队列

  • 定义:可以向取出后的位置重新添加元素的一种队列。

  • 实现逻辑:
    不变的还是下标和数组。变化的是表示下标的数在经过取余操作后,可以有11表示1了。

  • 注意事项:数组为空,为满的判断条件。
    rear指向最后一个元素的后一个位置
    front指向第一个元素
    数组满的条件:
    (rear+1)%max=front //因为数组下标的最大只有max-1
    数组为空的条件:
    front=rear
    数组的有效个数:
    (rear+max-front-1)%max+1 (0 1 注意rear是指向最后一个数后一个位置,不减去1再加上1的话,对于0 4是错误的)

public Circle_Queue(int max){
	this.max=max;	
	}

添加元素,加入后后移

public void add(int num){
	if(isfull()){
		System.out.println("队列已经满了");
		}
		queue[rear]=num;
		rear=(rear+1)%max;
	}
public void get(){
	if(isempty()){
		System.out.println("队列为空");
		}
		int value=queue[front];
		front=(front+1)%max;
	}

对于队列与环形队列的总结

  • 指针的初始值
  1. 环形队列(front,rear=0)
  2. 队列(front,rear=-1)
  • 添加与取出元素
  1. 环形队列(先改变值,后操作数组)
  2. 队列(后改变值,先操作数组)

上面的效果是相同的
为什么会出现这样的情况了?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值