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

文章目录

  • 1 队列的定义
  • 2 队列的特点
  • 3 顺序队列
    • 3.1 数据结构逻辑图
    • 3.2 定义队列属性值
      • 3.2.1 逻辑梳理
      • 3.2.2 代码实现
    • 3.2 定义判空方法
      • 3.2.1 逻辑梳理
      • 3.2.2 代码实现
    • 3.3 定义入队方法
      • 3.3.1 逻辑梳理
      • 3.3.2 代码实现
    • 3.4 定义出队方法
      • 3.4.1 逻辑梳理
      • 3.4.2 代码实现
  • 4 循环队列
    • 4.1 数据结构逻辑图
    • 4.2 定义队列属性值
      • 4.2.1 逻辑梳理
      • 4.2.2 代码实现
    • 4.2 定义判空方法
      • 4.2.1 逻辑梳理
      • 4.2.2 代码实现
    • 4.3 定义入队方法
      • 4.3.1 逻辑梳理
      • 4.3.2 代码实现
    • 4.4 定义出队方法
      • 4.4.1 逻辑梳理
      • 4.4.2 代码实现
      • 4.4.2 代码实现

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

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

✈️本篇内容: 队列✈️

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

1 队列的定义

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

每天一道算法题——队列基础_第1张图片

2 队列的特点

(1)先进先出。

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

3 顺序队列

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

3.1 数据结构逻辑图

每天一道算法题——队列基础_第2张图片

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 数据结构逻辑图

每天一道算法题——队列基础_第3张图片

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;
}

你可能感兴趣的:(数据结构和算法,1024程序员节,数据结构,java)