数据结构之栈

182 阅读1分钟

栈的特征

image.png

栈的应用

  • 系统栈 image.png
  • 括号匹配问题。LeetCode-20。 image.png
/**
 * 有效字符串需满足:
 * - 左括号必须用相同类型的右括号闭合。
 * - 左括号必须以正确的顺序闭合。第一个必须是左括号。
 */
public static boolean isValid(String s) {
    Stack<Character> stack = new Stack<>();
    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 top = stack.pop();
            // 三个边界条件
            if(c == ']' && top != '[') {
                return false;
            }

            if(c == ')' && top != '(') {
                return false;
            }

            if(c == '}' && top != '{') {
                return false;
            }
        }
    }

    // 上面的边界条件都判断后,可能栈中还存在元素,如果存在元素也是false。
    return stack.isEmpty();
}

栈的实现

image.png image.png

public interface StackInterface<E> {
//    push
    void push(E e);
//   pop
    E pop();
//    获取栈中元素个数
    int getSize();
// peek
    E peek();
//    isEmpty
    boolean isEmpty();
}

public class ArrayStack<E> implements StackInterface<E> {
    private Array<E> array;
    private int capacity;

    public ArrayStack(int capacity) {
        array = new Array(capacity);
    }

    public ArrayStack() {
        this(10);
    }

    @Override
    public void push(E e) {
        array.addLast(e);
    }

    @Override
    public E pop() {
        E e = array.removeLast();
        return e;
    }

    @Override
    public int getSize() {
        return array.getSize();
    }

    @Override
    public E peek() {
        return array.getLast();
    }

    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("Stack [");
        for(int i = 0; i < array.getSize(); i++) {
            res.append(array.get(i));
            if(i != array.getSize() - 1) {
                res.append(",");
            }
        }
        res.append("] top");
        return res.toString();
    }
}

复杂度分析

image.png