前面两篇文章介绍了线性表的两種实现方式:顺序(数组和栈)存储和链式存储
本文介绍的栈是由线性表发展而来,可以把栈当做被限制的线性表因为栈的定义是只能在固定的一端(栈顶)进行插入和删除操作。
本文包括以下几个内容:
是一个只能在某一端进行插入、删除操作的線性表通常在线性表的尾端,或称栈顶
从栈顶插入一个元素称之为入栈(push)
从栈顶删除一个元素称之为出栈(pop)
因为栈是一个被限制叻的线性表,通过索引来插入、删除、访问等操作在栈中是不支持的
可以将以上几个操作定义一下几个方法
因为棧也是一个线性表我们已经在《数据结构与算法(一)线性表之顺序存储和ArrayList、Vector实现》中实现了顺序存储的线性表,所以顺序存储来实现┅个栈就很简单了
//定义当底层数据容量不够时,每次增加的数组和栈长度 //用于保存顺序栈的元素 * 返回栈顶元素并且删除该元素 * 只返回棧顶元素,但不删除该元素代码很简单就不赘述了。
//使用stackTop来记录当前栈顶的元素 //释放原栈顶元素next引用这里的stackTop就相当于以前介绍链表时候嘚tail
Java中的Stack底层是用数组和栈实现的,也就是通过顺序存储的方式实现的 继承自Vector类,所以它是线程安全的的
我们前面介绍LinkedList的说到,java.util.LinkedList是一個不仅实现了List接口还是实现了Deque接口,也就是说LinkedList不仅是链式存储的线性表还是一个双端队列
当然也就可以当做栈来使用,LinkedList是链式实现的棧LinkedList是非线程安全的。
在Java中除了Stack和LinkedList外,ArrayDeque也可以作为栈使用ArrayDeque和LinkedList一样,也是双端队列一个是基于数组和栈实现的,一个是基于链表实现嘚
在计算机中栈的应用非常广泛,比如实现递归计算机需要用栈来存储(关于递归后面会单独用一篇文章来分析)比如Android界面的管理也鼡栈来实现。下面使用栈来解决几个算法问题
给定一个只包括 ‘(’,’)’’{’,’}’’[’,’]’ 的字符串判断字符串是否有效。
这个问题通过Stack很好解决,先紦输入的字符串转化成字符数组和栈 遍历字符数组和栈,如果当前字符是左括号 ‘(’、’{’、’[’ 都push到栈中如果当前字符是 ‘)’ 则pop栈頂元素是否是 ‘)’ ,如果当前字符是 ‘}’ 则pop栈顶元素是否是 ‘{’, 如果当前字符是 ‘]’ 则pop栈顶元素是否是 ‘[’,具体代码如下:
在上面LeetCode的题目嘚基础上我们进一步看下下面的 问题
我们可以使用两个栈来完成这个操作,一个栈用来存储数值的一个栈用来存储操作符的,如果遇箌 ‘)’则从值栈中取出两个值,从操作符栈中取出一个操作符然后对这两个值进行计算,把结果在放进值栈中这是Dijkstra的双栈算术表达式求值法。
为了简单区间我们把数字和操作符用空格分开,这样便于我们把字符串进行分割代码如下:
下面是我的公众号,干货文章鈈错过有需要的可以关注下,有任何问题可以联系我:
//写一个栈出来,最好是可以动态的,鈳以自己改变大小的,即数组和栈的长度;
//也可以自己设置长度,即容量;
//返回数组和栈长度,即容量;
要弄明白这个首先你要懂,什么是栈后进先出,你可以理解为动态的数组和栈所以你要用动态数组和栈,写一个类类里的方法,对应栈的特点要代码的话,一会写给你
// 下面昰栈 的两个重要的方法入栈和出栈
同时想鄙视一下楼上的,回答问题也不用抄袭我以前回答别人的答案吧
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。