1、什么是栈
栈也是一种线性结构,
相比数组,栈对应的操作是数组的子集
只能从一端添加元素,也只能从一端取出元素
这一端称为栈顶
栈是一种后进先出的数据结构。
2、栈的应用
1) 编辑器无处不在的Undo操作(撤销)
2) 程序调用的系统栈

函数A中调用函数B,函数B中调用函数C。
如果C函数执行完了,从栈中查看是B2,接着执行B2的下面1行代码。
如果B函数执行完了,总栈中查看是A2,接着执行A2的下面1行代码。
3) 括号匹配 编译器
3、自定义栈
定义接口
public interface Stack<E> {
int getSize();
boolean isEmpty();
void push(E e);
E pop();
E peek();
}
定义自定义栈。基于前面创建的动态数组CustomArray自定义数组(动态数组)
public class ArrayStack<E> implements Stack<E> {
CustomArray<E> array;
public ArrayStack(int capacity){
array = new CustomArray<E>(capacity);
}
public ArrayStack(){
array = new CustomArray<E>();
}
public int getSize() {
return array.getSize();
}
public boolean isEmpty() {
return array.isEmpty();
}
public int getCapacity(){
return array.getCapacity();
}
public void push(E e) {
array.addLast(e);
}
public E pop() {
return array.removeLast();
}
public E peek() {
return array.getLast();
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("Stack: ");
res.append("[");
for(int i = 0; i < array.getSize(); i++){
res.append(array.get(i));
if(i != array.getSize() - 1){
res.append(", ");
}
}
res.append("]");
return res.toString();
}
}
4、编译器 括号匹配
问题描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
解决方法: 如下代码所示
public class Solution {
public boolean isValid(String s){
Stack<Character> stack = new Stack<Character>() ;
for(int i = 0; i < s.length() ; i++){
char c = s.charAt(i);
if(c == '(' || c == '[' || c == '{' ){
stack.push(c);
}else {
if(stack.isEmpty()){
return false;
}
char topChar = stack.pop();
if( c == ')' && topChar != '('){
return false;
}
if( c == ']' && topChar != '['){
return false;
}
if( c == '}' && topChar != '{'){
return false;
}
}
}
return stack.isEmpty();
}
}