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(); } }