每天一道算法题——队列基础

本文详细介绍了队列的定义和特点,特别是顺序队列和循环队列的数据结构逻辑图、属性定义、判空、入队、出队方法的逻辑梳理及Java代码实现。通过示例代码,阐述了如何使用数组实现先进先出的队列操作,并探讨了循环队列在空间利用上的优势。
摘要由CSDN通过智能技术生成

✨这里是第七人格的博客。小七,欢迎您的到来~✨

🍅系列专栏:【数据结构和算法】🍅

✈️本篇内容: 队列✈️

🍱本篇收录完整代码地址:数据结构和算法-Java实现🍱

1 队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。说人话就是,队列是一种特殊的链表或者数组,就像排队买票,先来的先买,后来的后买,不允许插队,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。如图所示:

image-20221017230850242

2 队列的特点

(1)先进先出。

(2)线性表:链表或者数组。

3 顺序队列

顺序队列是队列的顺序存储结构,通常采用一维数组进行存储,其中连续的存储单元依次存放队列中的元素。进行插入操作的端称为队尾,进行删除操作的端称为队头。

3.1 数据结构逻辑图

image-20221017231722519

3.2 定义队列属性值

3.2.1 逻辑梳理

  1. 底层结构为数组,所以我们需要定义一个数组来存储数据。
  2. 往数组里面放数据,我们需要一个大小的属性。
  3. 定义队头进行删除操作,定义队尾进行插入操作。

3.2.2 代码实现

public class ArrayQueue {

	/**
	 * 数据
	 */
	private int data[];
	/**
	 * 头
	 */
	private int head = 0;
	/**
	 * 尾
	 */
	private int tail = 0;
	/**
	 * 数组的大小,即最大的空间
	 */
	private int n = 0;
}

3.2 定义判空方法

3.2.1 逻辑梳理

头尾相等,则表示队列为空

3.2.2 代码实现

/**
 * 是空
 *
 * @return boolean
 */
public boolean isEmpty() {
   // 头尾相等,那么队列肯定为空
   return head == tail;
}

3.3 定义入队方法

3.3.1 逻辑梳理

  1. 数据入队尾
  2. 入队后,队尾指针后移

3.3.2 代码实现

/**
 * 入队
 *
 * @param num 值
 */
public void push(int num) {
    //判断我们这个队列是不是已经满了
    if (tail == n) {
        return;
    }
    // 1、数据入队尾
    data[tail] = num;
    // 2、入队后,队尾指针后移
    tail++;
    // 3、以上代码可以简化为 data[tail++] = num
}

3.4 定义出队方法

3.4.1 逻辑梳理

  1. 将头指针指向下一个,元素,则当前头出队

3.4.2 代码实现

/**
 * 出队
 *
 * @return int
 */
public int pop() {
    // 判断空
    if (isEmpty()) {
        // 这里用-1表示空
        return -1;
    }
    // 将头指针指向下一个,元素,则当前头出队
    return data[head++];
}

4 循环队列

循环队列是一种特殊的队列,他首尾相连,每一端都可以进行插入数据和删除数据操作。

4.1 数据结构逻辑图

image-20221018002926910

4.2 定义队列属性值

4.2.1 逻辑梳理

  1. 底层结构为数组,所以我们需要定义一个数组来存储数据。
  2. 往数组里面放数据,我们需要一个大小的属性。
  3. 定义队头进行删除操作,定义队尾进行插入操作。

4.2.2 代码实现

public class ArrayQueue {

	/**
	 * 数据
	 */
	private int data[];
	/**
	 * 头指针
	 */
	private int head = 0;
	/**
	 * 尾指针
	 */
	private int tail = 0;
	/**
	 * 数组的大小,即最大的空间
	 */
	private int n = 0;
}

4.2 定义判空方法

4.2.1 逻辑梳理

(1)头尾相等,则表示队列为空。

4.2.2 代码实现

	/**
	 * 是空
	 *
	 * @return boolean
	 */
	public boolean isEmpty() {
		// 我们这里定义:头尾指向相同,那么队列为空
		return head == tail;
	}

4.3 定义入队方法

4.3.1 逻辑梳理

  1. 循环队列规定最多只能有n-1个队列元素,所以当循环队列中只剩下一个空存储单元时,队列就已经满了。翻译成代码就是 (tail + 1) % n == head。
  2. 数据入队尾。
  3. 入队后,队尾指针后移。

4.3.2 代码实现

/**
 * 入队
 *
 * @param num 数
 */
public void push(int num){
   // 判断队列是否是满的
   if((tail + 1) % n == head){    
      return ; 
   }
   // 1、数据入队尾
   data[tail] = num;
   // 2、入队尾后,指针后移 
   tail = (tail + 1) % n;
}

4.4 定义出队方法

4.4.1 逻辑梳理

  1. 获取头数据,出队列。
  2. 入队后,队头指针后移。

4.4.2 代码实现

/**
 * 出队
 *
 * @return int
 */
public int pop(){
   // 判断队列是否是空的
   if(isEmpty()) {
      // 表示空
      return -1;
   }
   // 获取头数据,出队列
   int m = data[head];
   // 头指针向后移
   head = (head + 1) % n;
   return m;
}

4.4.2 代码实现

/**
 * 出队
 *
 * @return int
 */
public int pop(){
   // 判断队列是否是空的
   if(isEmpty()) {
      // 表示空
      return -1;
   }
   // 获取头数据,出队列
   int m = data[head];
   // 头指针向后移
   head = (head + 1) % n;
   return m;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

第七人格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值