乐趣区

关于数据结构:结构与算法02队列和栈结构

本文源码:GitHub·点这里 || GitEE·点这里

一、队列构造

1、根底概念

队列是一种非凡的线性表,非凡之处在于它只容许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

2、特点形容

队列是一个有序列表,能够用数组或是链表来实现,遵循先进先出的准则。即: 先进入队列的数据,会先取出;后进入队列的数据,要后取出;即 FIFO 准则。

入队列示意图

出队列示意图

通过上述两张图解,不难发现队列构造的一些特点:

  • 先进入的数据先进来;
  • 数据从队尾进入,从队首进来;
  • 基于数组形容队列下标变更频繁;
  • 出队列算法能够基于容器大小取模;

队列构造的外围是对容器内是否空、是否满标记的判断算法,即容器为空不可再取,容器已满无奈再存;该算法构造在仓储畛域的适应十分宽泛。

3、音讯队列

音讯队列就是基于数据结构中的“先进先出”策略实现的,将音讯以排队的形式放入队列中,而后出队列被生产:

有时候某类音讯生产须要有顺序控制,即能够对音讯中的公共 ID 做取模解决,即把某类音讯都置于一个队列中即可。

4、API 应用案例

LinkedList 类实现 Queue 队列接口,因而能够基于 LinkedList 模仿队列成果。

import java.util.LinkedList;
import java.util.Queue;

public class M01_Queue {public static void main(String[] args) {
        // 入队列
        Queue<String> queue = new LinkedList<>();
        queue.add("head") ;
        queue.add("middle") ;
        queue.add("tail") ;
        // 当队列出数据之后,size 是一直变动的
        int queueSize = queue.size() ;
        int loop = 0 ;
        // 依据队列大小,一直出队列
        while (loop < queueSize) {System.out.println(queue.poll());
            System.out.println(queue);
            loop ++ ;
        }
    }
}

二、栈构造

1、根底概念

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,绝对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的下面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2、特点形容

栈是一个先入后出的有序列表,增加和删除只能在栈顶端 (Top) 操作,另一端为固定的一端,称为栈底(Bottom)。

入栈示意图

出栈示意图

通过上述两张图解,栈构造的一些特点如下:

  • 进栈出栈都要通过栈顶端操作;
  • 进出栈都不挪动栈底指针;
  • 进出栈都要挪动栈顶指针;

基于栈的定义可知,最先放入栈中元素在栈底,最初放入的元素在栈顶,从栈容器中而删除元素刚好相同,最初放入的元素最先删除,最先放入的元素最初删除。

3、递归利用

栈在 Java 编程中的常见利用,(1)子程序的调用:在跳往子程序前,会将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,退回到原来的程序中;(2)解决递归调用:和子程序的调用相似,除了存储下一个指令的地址外,也要将参数、区域变量等数据存入堆栈中。

4、API 应用案例

Stack 栈 API 是 Vector 的一个子类,它实现了一个规范的后进先出的栈,堆栈只定义了默认构造函数,用来创立一个空栈,堆栈除了包含由 Vector 定义的所有办法,也定义了本人的一些办法。

import java.util.Stack;

public class M02_Stack {public static void main(String[] args) {
        // 入堆栈
        Stack<String> stack = new Stack<>() ;
        stack.push("First") ;
        stack.push("Second") ;
        stack.push("Third") ;
        int stackSize = stack.size() ;
        int loop = 0 ;
        // 依据栈大小,一直出栈
        while (loop < stackSize) {System.out.println(stack.pop());
            System.out.println(stack);
            loop ++ ;
        }
    }
}

三、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

举荐浏览:数据结构和算法

序号 文章题目
01 算法和构造(01):稠密数组和二维数组转换
02 算法利用:RSA 算法,加密解密,签名验签流程详解
03 算法利用:递归算法,解决树形构造下的业务数据
退出移动版