本周刷了leetCode中可以用栈解决的一些题目。在此之前先简单介绍下栈以及栈在java中的一些常用方法。
定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈是一种先进后出(FILO)的数据结构。
java中常见用法
1-->public Stack()创建一个空堆栈
2-->public boolean empty()测试堆栈是否为空;
3-->public E pop()移除堆栈顶部的对象,并作为此函数的值返回该对象。
4-->public E push(E item)把项插入堆栈顶部
5-->public E peek()查看堆栈顶部的对象,但不从堆栈中移除它。
刷题总结
从应用到栈的题目类型中可以看到,我们可以运用栈来解决一些特定符号或者极值的判断。比如有效的括号,字符串解码这几道题目中。我们可以用栈记录信息,然后在需要的时候通过栈顶元素来进行运算得到我们想要的结果。而比如每日温度这道题中,我们创建一个栈来记录数组的下标,当下一个元素的值比前一个大的时候将栈中元素pop后用新的下标去替换,否则往栈中push新的下标,此时栈中的记录的下标对应的元素肯定是单调递减的,也就是题解中所说的单调栈了。
此外,通过这次刷题,还知道了可以用不定长数组来模拟栈操作,方便从栈底向栈顶遍历。因为栈的常用方法中并没有提供遍历栈的API,所以有的时候我们可以通过LinkedList去模拟栈操作。
当LinkedList被当做栈来使用时,常用api及对应关系如下:
栈方法 等效方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst() isEmpty() //判断是否为空