一、如何理解栈

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

二.栈如何实现

其实它是一个限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈其实就是一个特殊的链表或者数组。
既然栈也是一个线性表,那么我们肯定会想到数组和链表,而且栈还有这么多限制,那为什么我们还要使用这个数据结构呢?不如直接使用数组和链表来的更直接么?数组和链表暴露太多的接口,实现上更灵活了,有些技术理解不到位的人员就可能出错。所以在某些特定场景下最好是选择栈这个数据结构。

2.1基于数组来实现

image.png

2.2基于链表来实现

image.png

2.3基于数组和链表的区别:

最大的区别就是扩容,链表天然支持动态扩容。
数组容易栈溢出。

三、栈的经典应用

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

比如给你一串括号让你判断是否符合我们的括号原则,如下所示:
[(){()}{}]符合{}[]{[][[]
[][]{
{}[}}{}}]]] 不符合

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

用两个栈就可以轻松解决,一个前进栈,一个后退栈
如下:假设有三个页面A、B、C当前加载到了前进栈里,当我点一次后退时把栈A的最顶页面C出栈到后退栈,再点一次后退继续把B页面出栈到后退栈,当点前进的时候再把栈从后退栈出栈压回栈A
image.png

3.表达式求值如:1+2*3

java的表达式计算就是基于jvm里的操作数栈来实现的