Java版数据结构栈

Posted chenry777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java版数据结构栈相关的知识,希望对你有一定的参考价值。

一、栈的基本结构

1. 结构图

后进先出(LIFO) 、先进后出(FILO)

2. 如何理解栈

比如我们在放盘子的时候都是从下往上一个个放,拿的时候是从上往下一个个的那,不能从中间抽,这种其实就是一个典型的栈型数据结构。后进先出即Last In First Out (LIFO)。

3.栈如何实现

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

栈其实就是一个特殊的链表或者数组。

既然栈也是一个线性表,那么我们肯定会想到数组和链表,而且栈还有这么多限制,那为什么我们还要使用这个数据结构呢?不如直接使用数组和链表来的更直接么?数组和链表暴露太多的接口,实现上更灵活了,有些技术理解不到位的人员就可能出错。所以在某些特定场景下最好是选择栈这个数据结构。

4.栈的分类

(1)基于数组的栈——以数组为底层数据结构时,通常以数组头为栈底,数组头到数组尾为栈顶的生长方向

(2)基于单链表的栈——以链表为底层的数据结构时,以链表头为栈顶,便于节点的插入与删除,压栈产生的新节点将一直出现在链表的头部

最大的区别就是扩容,链表天然支持动态扩容。使用栈容易出现内存溢出的问题(栈溢出)。

二、设计一个栈

代码已上传github,地址见文末

三、面试经典

1.如何设计一个括号匹配的功能?

比如给你一串括号让你判断是否符合我们的括号原则,如下所示:

[(){()}{}]符合{}[]{[][[]

[][]{

{}[}}{}}]]] 不符合

代码已上传github,地址见文末

2.如何设计一个浏览器的前进和后退功能?

两个栈实现

代码已上传github,地址见文末

3.代码函数调用中的应用

main(){
	add();
}

add(){
	sub();
}

是不是这个sub最先完成。sub又是最后才进来的吧?是不是就是后进先出,函数调用就是用的栈来实现的。

4.数学表达式求值

比如用栈实现一个简单的四则运算:3+11*2+8-15/5,用栈来实现这个算术表达式

两个栈来实现:一个放数字 一个放符号。

我们从头开始遍历这个算术表达式:

1.遇到是数字 我们就直接入栈到数字栈里面去。

2.遇到是符号 就把符号栈的栈顶拿出来做比较。如果说他比栈顶符号的优先级高就直接入栈,如果比符号栈顶的优先级低或者相同,就从符号栈里面取栈顶进行计算(从数字栈中取栈顶的2个数),计算完的结果还要再放入到数字栈中。

https://github.com/chenruoyu0319/data-structure-for-java/tree/main/%E6%A0%88

以上是关于Java版数据结构栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 Java 版详解栈和队列的实现

好课分享:开课吧数据分析全栈工程师第8期 老杜2020版Java零基础685集(视频采用JDK13录制)

回栈事务后如何持久化分片数据?

Java运行数据区----初步版

[vscode]--HTML代码片段(基础版,reactvuejquery)

Java-数据结构练习