标签:push 动态数组 leetcode builder block 图片 数据结构 思路 als

其实,实现一个栈结构非常简单,我们只需要复用上一节我们自己封装的数组就可以快速的实现一个栈的创建。
以数组的最后一个元素当成栈顶元素。
public interface Stack<E> {
    boolean isEmpty();
    int getSize();
    // 移除栈顶元素
    E pop();
    // 查看栈顶元素
    E peek();
    // 压入栈
    void push(E ele);
}
注:这里我们有一个peek方法,就是查看栈顶元素,所以我们需要给我们自己封装的数组类添加一个查看最后一个元素的方法:
// 获取最后一个元素
public E getLast() {
    return get(size - 1);
}
    public class ArrayStack<E> implements Stack<E> {
    private ArrayNew<E> array;
    public ArrayStack(int capacity) {
        array = new ArrayNew<>(capacity);
    }
    public ArrayStack() {
        array = new ArrayNew<>();
    }
    public int getCapacity() {
        return array.getCapacity();
    }
    @Override
    public int getSize() {
        return array.getSize();
    }
    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }
    @Override
    public void push(E ele) {
        array.addLast(ele);
    }
    @Override
    public E pop() {
        return array.removeLast();
    }
    @Override
    public E peek() {
        return array.getLast();
    }
    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("Stack: [");
        for (int i = 0; i < getSize(); i++) {
            res.append(array.get(i));
            if (getSize() - 1 != i) {
                res.append(", ");
            }
        }
        res.append("] top");
        return res.toString();
    }
}
注:其中的ArrayNew即是我们在上一节自己封装的数组类,不知道的同学可以去查看:
我理解的数据结构(一)—— 不要小看了数组
因为我在ArrayNew中已经实现了动态数组,所以不用考虑栈长度的问题,这样我们就自己封装了一个栈(注释在Stack接口中和ArrayNew类中足够详细)。
这是一道leetcode上,编号为20的题目,具体题目描述如下:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
    1.左括号必须用相同类型的右括号闭合。
    2.左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解题思路
如果拿到的是右括号,则需要做匹配判断。
pop出栈顶元素。false。如果字符串比较完成,没有返回false,则判断栈是否为空。
true,括号匹配成功false
    public boolean isValid(String s) {
    ArrayStack<Character> stack = new ArrayStack<>();
    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();
}
| 方法 | 复杂度 | 
|---|---|
| push | O(1) 均摊 | 
| pop | O(1) 均摊 | 
| peek | O(1) | 
| getSize | O(1) | 
| isEmpty | O(1) | 
因为栈的时间复杂度都是O(1),所以栈的性能是很高的。
原文地址:https://segmentfault.com/a/1190000016067831
标签:push 动态数组 leetcode builder block 图片 数据结构 思路 als
原文地址:https://www.cnblogs.com/lalalagq/p/9974859.html