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版数据结构栈的主要内容,如果未能解决你的问题,请参考以下文章
好课分享:开课吧数据分析全栈工程师第8期 老杜2020版Java零基础685集(视频采用JDK13录制)