线性结构:栈

思路

栈是一种先进后出(First In Last Out, FILO)的数据结构。相对上一篇的数组,它只能在最后添加或删除元素,因此它是数组的一个子集,可复用上一章的数组实现栈结构。

实现

先定义一个栈的接口

public interface Stack<E> {

    int size();

    boolean isEmpty();

    void push(E e);

    E pop();

    E peek();

}

其中pop会将栈顶元素推出,而peek只会读栈顶的值,不会改变栈。

实现数组栈:

public class ArrayStack<E> implements Stack<E> {
    private final Array<E> array;

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

    public ArrayStack() {
        array = new Array<>();
    }

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

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

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

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

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

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(String.format("Stack ")).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();
    }


}

复杂度分析

由于只能在栈顶操作,因此数组栈的所有方法的复杂度都为O(1)

力扣(20):有效的括号

解题思路是利用栈结构,当碰到左括号时压入栈,碰到又括号时看是否栈顶有与之匹配的左括号。

class Solution {
    public boolean isValid(String s) {
        Stack<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;
                }
                if (c == ')' && stack.pop() != '(') {
                    return false;
                }
                if (c == ']' && stack.pop() != '[') {
                    return false;
                }
                if (c == '}' && stack.pop() != '{') {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 特点: 栈是一种线性结构 相比数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从同一端取出元素 是一种后...
    二妹是只猫阅读 876评论 0 0
  • 数据结构和算法是计算机技术的基本功之一,北京大学的课程深入浅出,使用Python作为载体简化了编程难度。今天浏览了...
    柳誉鸣阅读 262评论 0 5
  • 大纲:*掌握栈的定义、栈的存贮结构及基本操作的实现。理解用栈实现表达式的求值,递归过程及实现。掌握队列的定义、存贮...
    堂前雪半阅读 702评论 0 0
  • 简介 某种程度上来说,栈和队列也是线性表,只是它们是操作受限制的线性表。 栈 栈是一种只能在表尾进行插入或者删除的...
    爱笑的云里看梦阅读 986评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,557评论 16 22