一.栈
栈是一种先进后出的结构:(先出来的是45,要出12就必须先把前面的数据全部出完。)
2.实例化一个栈对象:
3.入栈:
4.出栈:(当走完pop就直接弹出45了。)
5.出栈的返回值可以接收:
6.peek只看当前数据并不会像pop一样删除数据:
7.Stack继承Vector,但是Vector过时了。
二.自己实现栈
1.通过数组来表示栈:![](https://i-blog.csdnimg.cn/direct/f45e0531972e45539024cb7d5f43cd14.png)
![](https://i-blog.csdnimg.cn/direct/4ce38aa6ad424d468e29d0ca0c45da0c.png)
2.入栈:![](https://i-blog.csdnimg.cn/direct/9ed02e2a0ffa4e64b6b7f3616c9650f1.png)
3.出栈:![](https://i-blog.csdnimg.cn/direct/c018b78aba27407395b717a537ff20a7.png)
4.peek:![](https://i-blog.csdnimg.cn/direct/d0f0b8cf81b441f3ab934e068b811662.png)
三.Stack的题
1.这道题选C:(这里的栈不是依次放入和依次取出的,所以说一下A为什么对,其余的都是类比方法。我们可以先对1进行入栈,之后在对1进行出栈,然后在对2 3 4依次压栈,在对2 3 4依次出栈就是4 3 2所以A是对的。)
2.这道题选B:(需要注意的是这里的题是依次入栈和压栈,所以就只能选B,看题一定要仔细)
3.把递归转化为循环:
4.逆波兰表达式求值:(算法是中缀表达式的从左往右按照算法的优先级加小括号,然后在从左往右通过算法的优先级取出操作符,然后算出这个后缀表达式,我们将得到的后缀表达式中数字先进行入栈,遇到运算符就出栈两个数据,第一个出栈的数据作为右操作数,第二个出栈的为左操作数,然后进行运算之后的数字再入栈进行计算,最后一个数入栈的数字就是结果。)
代码:
有效的括号匹配:
(思路:用栈来完成,这道题的思路就是给了一个括号字符串({}),我们需要拿到最里面的左括号那么需要通过入栈然后再出栈就能拿到最里面的左括号,那么意思就是当为左括号的时候就入栈,当为右括号的时候就不再入栈而是出栈了,所以刚刚的字符串当我们拿到最后一个 { 的时候,下一个为右括号则不在入栈,就要出栈看是否与这个右括号匹配,匹配的话我们就继续比对下一个右括号,如果还是配对的话这个字符串就遍历完了,这里的遍历是通过循环来遍历的,然后退出循环,此时的栈是空的,也就说明这个配对的情况是在循环走完,并且栈是空的才是完全配对的(循环走完),所以当第二个例子,我们就可以看出拿到最里面的括号的时候,不配对就直接返回false后就可以了,第三个例子就是只有一个左括号,有多个右括号,当配对完一个循环还没走完,但是栈空了(此时是在循环内部栈空的,说明此时字符串还没遍历完,代表该字符串括号没有多余的左括号来进行匹配了),此时也是不匹配的所以返回false。第四种情况就是左边括号多了,配对完一个右括号,循环就走完了,但是此时的栈不是空的,所以也是不匹配的返回一个false。)
代码:
出栈入栈次序匹配:(思路:既然要入栈的顺序是定的,那么我们判断出栈的顺序就是通过循环来判断。我们给入栈顺序的数组下标为 i 出栈数组的下标为 j ,我们通过遍历入栈顺序的数组来进行入栈数据,当入栈的元素与出栈元素想相同时我们就一直出栈,不同的时候在进行循环,如果循环结束并且栈为空那么这个入栈顺序的数组和这个出栈顺序的数组是匹配的。需要注意的是,当我们在进行判断是否需要出栈时的条件时,我们需要先判断的是,j 的值不能超过出栈数组的长度,并且栈不能为null不然我们就无法对栈中的元素和出栈顺序数组的元素来进行匹配了)
最小栈:(题设的要求是自己写一个找到最小的数据的时间复杂度是常数,那么这都题就需要两个栈,一个栈是用来存放实际数据的,另一个栈是来存放最小数据的,这样我们就可以直接出栈最小的数据。这里需要注意的是,入栈的时候如果存放第一个数据的时候,两个栈都要存放数据在里面。出栈的时候是直接出的正常栈的数据,但是我们需要知道,如果正常栈的栈顶数据就是最小的数据,那么最小栈的数据也要将这个数据出栈,这里出栈的时候需要判断最小栈是否为null保证安全性。还需要知道在比较两个引用类型的时候我们要用equals来比较两个是否相同,通过equals的返回值可以确定。或者把另一个数据拆箱成基本数据类型就可以直接用==来比较了。这里用equals比较的话会比较浪费时间)