[数据结构】栈和队列

news/2024/10/23 7:22:50/

目录

1.栈

1.1概念

1.2 栈的使用

1.3.栈的模拟实现

2.队列

2.1概念

2.2队列的使用

2.3队列的模拟实现

2.4 循环队列

2.5双端队列


1.栈

1.1概念

  栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶
有点类似于步枪压子弹一样,先压进去的最后在发射,最后压进去的先发射。先进后出。

1.2 栈的使用

方法功能
Stack()构造一个空的栈
E push(E e)将e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素个数
boolean empty()检测栈是否为空

1.3.栈的模拟实现

从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。

我们使用数组来模拟实现一个栈
 

public class MyStack<E> {int[] array;int size;public  MyStack(){array=new int[3];}//压栈public int push(int val){array[size] = val;size++;return val;}//弹出栈顶元素public int pop(){int temp= peek();size--;return temp;}//查看栈顶元素public int peek(){if(empty()){return -1;}return array[size-1];}public boolean  empty(){return size==0;}//遍历public void display(){for (int i = 0; i < size; i++) {System.out.print(array[i]+ " ");}}//获取栈中元素个数public int size(){return size;}}

2.队列

2.1概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头 (Head/Front)。

2.2队列的使用

在Java中,Queue是个接口,底层是通过链表实现的。

方法功能
boolean offer(E e)入队列
E poll()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty()检测队列是否为空

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。


2.3队列的模拟实现

  我们使用单向链表来模拟实现一个队列

  首先我们思考一个问题,插入的操作很容易,但是当我们想弹出队尾元素的时候,因为是基于链表的,所以我们得知道它的前一个节点,这样才好把它给获取并删掉,如果我们采取尾插法,自然是做不到的,所以我们采取头插法。

public class MyQueue {class Node{private int val;private Node next;public Node(int val){this.val=val;}}private Node head;private Node last;private int size;public void offer(int data){Node node = new Node(data);if(head==null){head = node;last = node;size++;}else {last.next=node;last=node;}}public  int poll(){if(!isEmpty()){int tmp=head.val;head=head.next;return tmp;}return -1;}public boolean isEmpty(){return last==null;}public int peek(){if(!isEmpty()){return head.val;}return -1;}
}

2.4 循环队列

  实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。

2.5双端队列

 双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队

Deque是一个Deque是一个接口,使用时必须创建LinkedList的对象

在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口:


Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现


http://www.ppmy.cn/news/1123307.html

相关文章

实验室安全教育与考试

目录 我的错题&#xff08;2个&#xff09;新知识题目&#xff08;10个&#xff09;刚开始不太理解的题目&#xff08;10个&#xff09;写在最后&#xff08;免责声明&#xff09; 我的错题&#xff08;2个&#xff09; 18.发生电气火灾时可以使用的灭火设备包括&#xff1a;&…

MySQL索引事务

一 、 索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。 可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 索引保存的数据结构主要为B树&#xff0c;及hash的方式。 1. 作用 数据库中…

中秋国庆内卷之我爱学习C++

文章目录 前言Ⅰ. 内联函数0x00 内联函数和宏的比较0x01 内联函数的概念0x02 内联函数的特性 Ⅱ. auto&#xff08;C 11)0x00 auto的概念0x01 auto的用途 Ⅲ. 范围for循环(C11)0x00 基本用法0x01 范围for循环(C11)的使用条件 Ⅳ. 指针空值nullptr(C11)0x00 概念 前言 亲爱的夏…

gitee生成公钥和远程仓库与本地仓库使用验证

参考文档&#xff1a; https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE%E7%BD%AE(1)通过命令ssh-keygen 生成SSH key -t key类型 -c注释 ssh-keygen -t ed25519 -C "Gitee SSH Key" (2)按三次回车 (3)查看生成的 SSH 公钥和私钥&#xff1a; …

新增MariaDB数据库管理、支持多版本MySQL数据库共存,1Panel开源面板v1.6.0发布

2023年9月18日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.6.0版本。 在这个版本中&#xff0c;1Panel新增MariaDB数据库管理&#xff1b;支持多版本MySQL数据库共存&#xff1b;支持定时备份系统快照和应用商店中已安装应用&#xff1b;支持为防火墙…

elementui实现表格(el-table)默认选中

方法: 创建一个空数组用来存放默认数据 遍历表格的数据&#xff0c;再遍历需要在表格中反显的数据&#xff0c;两者的id一致&#xff08;两者之间共同的标识即可&#xff0c;一般以id做判断&#xff09; 把判断出来的默认表格数据push到创建的数组中 再遍历数组&#xff0c;将数…

5、SpringBoot_热部署

六、热部署 1.热部署概述 概述&#xff1a;程序更改后&#xff0c;不需要重新启动服务器也能够实现动态更新 springboot 项目如何实现热部署&#xff1f; tomcat 已经内置到项目容器中了希望tomcat监听外部程序变化通过新建一个程序来监控你代码的变化 2.依赖导入 依赖 <…

爬虫获取接口数据

上一讲讲的是获取静态网页数据的教程&#xff0c;适用于我们要爬取的数据在网页源代码中出现&#xff0c;但是还是有很多的数据是源代码中没有的&#xff0c;需要通过接口访问服务器来获得&#xff0c;下面我就来讲讲如何爬取这类数据。 以巨潮资讯网爬取比亚迪企业年报为例。…